Что именно означает «прямой доступ»?

#c# #xml

#c# #xml

Вопрос:

Я ищу классы для чтения большого XML-файла. Быстрая реализация класса C # XmlReader, XmlTextReader, обеспечивает «прямой доступ». Что это значит?

Комментарии:

1. В каком другом направлении может пойти читатель?

2. Это означает, что вы можете двигаться только вперед, а не назад, как указано. Вы можете двигаться только вперед; вы не можете выполнить резервное копирование. Что еще может означать «только прямой доступ»?

3. Это означает, что, когда устройство чтения расположено на узле XML, вы не можете получить доступ к содержимому из предыдущих узлов в потоке XML либо путем «перемотки» устройства чтения, либо путем доступа к некоторой информации DOM, которую читатель мог сохранить для вас. Если вам нужна информация о каком-то предыдущем родительском узле при обработке более позднего узла, вы должны сохранить эту информацию самостоятельно. Однако обратите внимание, что атрибуты элемента считаются частью самого узла элемента, и все они могут быть доступны, когда устройство чтения расположено на элементе.

4. Каждый раз, когда вы читаете узел, он переходит к следующему узлу, пока не останется больше узлов. Это похоже на SqlDataReader . Каждый раз, когда вы вызываете Read , он переходит к следующей записи. Невозможно повторно запросить предыдущую запись. Общая Reader часть имени предполагает, что вы не будете использовать его для обработки или анализа данных. Вы бы просто использовали его для получения данных. В том сценарии, когда вы только читаете его, нет причин возвращаться.

5. Вероятно, стоит понять, почему такая вещь существует: средство чтения только для прямого доступа может быть реализовано очень быстро и использовать очень мало памяти даже для огромных документов. Если у вас есть сценарий, в котором вам нужно читать очень большие XML-документы, и вы можете выполнить это в стиле только для прямого доступа, вам следует это сделать.

Ответ №1:

«только прямой доступ» означает именно это — вы можете перемещаться только по данным. Основными преимуществами такого подхода являются отсутствие необходимости хранить предыдущую информацию (что приводит к малому использованию памяти) и возможность чтения из источников, недоступных для поиска, таких как TCP stream (где вы не можете искать обратно, в отличие от файлового потока, который допускает произвольный доступ).

«Только для прямого доступа» очень легко увидеть для табличных структур (например, для чтения из базы данных) — программа чтения «только для прямого доступа» позволит вам только проверить «текущую» запись или перейти к следующей строке. Не будет возможности получить доступ к данным из уже просмотренных строк через такой reader (вы должны сохранять данные за пределами reader, чтобы иметь к ним доступ).

Для XmlReader это немного более запутанно, поскольку оно создает древовидную структуру из потока текста. С точки зрения чтения потока «только для прямого доступа» означает, что вы не сможете получить какие-либо данные, которые читатель уже просматривал (например, корневой узел, который в основном является первой строкой файла или родительским узлом текущего узла, как это должно было быть ранее в файле).

Но с точки зрения генерации дерева XML «только для прямого доступа» может сбивать с толку — он создает элементы в порядке глубины (потому что так они присутствуют в тексте XML), что означает, что «следующий» элемент не обязательно тот, который вы хотели бы видеть в дереве (особенноесли вы ожидаете доступ в ширину, например «имена всех авторов этой книги»).

Обратите внимание, что XmlReader позволяет вам получить доступ ко всем атрибутам текущего узла в любое время, поскольку он считает их частью «текущего элемента».