XmlTextReader против XDocument - PullRequest
       32

XmlTextReader против XDocument

16 голосов
/ 11 ноября 2011

Я в состоянии разобрать XML в .NET.Теперь у меня есть выбор между по крайней мере XmlTextReader и XDocument.Есть ли какие-либо сравнения между этими двумя (или любыми другими синтаксическими анализаторами XML, содержащимися в платформе)?

Может быть, это могло бы помочь мне принять решение, не испробовав оба из них подробно.

Файлы XMLОжидается, что он будет довольно небольшим, скорость и использование памяти - незначительная проблема по сравнению с простотой использования.: -)

(я собираюсь использовать их из C # и / или IronPython.)

Спасибо!

Ответы [ 2 ]

36 голосов
/ 11 ноября 2011

Если вы счастливы, читая все в память, используйте XDocument.Это сделает вашу жизнь намного проще.LINQ to XML - это прекрасный API.

Используйте XmlReader (например, XmlTextReader), если вам нужно обрабатывать огромные XML-файлы в потоковом режиме., в принципе.Это гораздо более болезненный API, но он позволяет выполнять потоковую передачу (т. Е. Обрабатывать только те данные, которые вам нужны, поэтому вы можете просматривать огромный документ и иметь только небольшой объем памяти за раз).

Естьгибридный подход, однако - если у вас огромный документ, состоящий из маленьких элементов, вы можете создать XElement из XmlReader, расположенного в начале элемента, обработать элемент с помощью LINQ to XML, а затем переместитьXmlReader на следующий элемент и начните снова.

10 голосов
/ 19 августа 2015

XmlTextReader отчасти устарел, не используйте его.

  1. Из блогов MSDN от XmlTeam

    Effective Xml Part 1: выберите правильноеAPI

    Избегайте использования XmlTextReader.Он содержит довольно много ошибок, которые нельзя исправить, не сломав существующие приложения, уже использующие его.

    Мир изменился, не так ли?API-интерфейсы XML, которые следует избегать.

    Устаревшие API-интерфейсы просты, поскольку компилятор помогает их идентифицировать, но есть еще два API-интерфейса, которые следует избегать, а именно XmlTextReader и XmlTextWriter.Мы обнаружили ряд ошибок в этих классах, которые мы не смогли исправить, не сломав существующие приложения.Самый простой путь - отказаться от этих классов и попросить людей использовать вместо них API-интерфейсы.К сожалению, эти два класса нельзя пометить как устаревшие, поскольку они являются частью стандарта ECMA-335 (Common Language Infrastructure) (http://www.ecma -international.org / публикации / стандарты / Ecma-335.htm ) -сопутствующий файл CLILibrary.xml, который является частью раздела IV).

    Хорошая новость заключается в том, что, хотя эти классы не устарели, в .NET Framework уже есть API-интерфейсы для их замены, и перейти к ним относительно легко.,Для начала необходимо найти места, где используется XmlTextReader или XmlTextWriter (к сожалению, это ручной шаг).Теперь все вхождения XmlTextReader должны быть заменены на XmlReader, а все вхождения XmlTextWriter должны быть заменены на XmlWriter (обратите внимание, что XmlTextReader происходит от XmlReader, а XmlTextWriter происходит от XmlWriterпоэтому приложение уже может использовать их, например, в качестве формальных параметров).Последний шаг - изменить способ создания объектов XmlReader / XmlWriter - вместо непосредственного создания средства чтения / записи необходимо использовать статический фабричный метод .Create(), представленный в API XmlReader и XmlWriter..

  2. Кроме того, intellisense в Visual Studio не перечисляет XmlTextReader в пространстве имен System.Xml.Класс определяется следующим образом:

    [EditorBrowsable(EditorBrowsableState.Never)]
    public class XmlTextReader : XmlReader, IXmlLineInfo, IXmlNamespaceResolver
    

Методы фабрики XmlReader.Create возвращают другие внутренние реализации абстрактного класса XmlReader в зависимости от переданных настроек.


Для потокового API только для пересылки (то есть, который не загружает всю вещь в память), используйте XmlReader через XmlReader.Create метод.

Дляболее простой API для работы, перейдите на XDocument он же LINQ To XML.Найдите XDocument против XmlDocument здесь и здесь .

...