XmlTextReader против XDocument

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

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

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

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

Спасибо!

2 ответа

Решение

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

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

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

XmlTextReader является своего рода устаревшим, не используйте его.

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

    Эффективная Xml часть 1: выберите правильный API

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

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

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

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

  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 aka LINQ To XML. найти XDocument против XmlDocument здесь и здесь.

Другие вопросы по тегам