#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 позволяет вам получить доступ ко всем атрибутам текущего узла в любое время, поскольку он считает их частью «текущего элемента».