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
является своего рода устаревшим, не используйте его.
Из блогов 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-интерфейсы.Кроме того, 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
здесь и здесь.