Поделиться через


Класс System.Xml.XmlTextReader

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Замечание

Рекомендуем создавать XmlReader экземпляры с помощью XmlReader.Create метода, чтобы воспользоваться новыми функциями.

XmlTextReader предоставляет доступ только для чтения к потоку XML-данных. Текущий узел ссылается на узел, на котором находится ридер. Средство чтения дополнительно использует любой из методов чтения и свойств, отражающих значение текущего узла.

Этот класс реализует XmlReader и соответствует языку расширяемой разметки W3C (XML) 1.0 и рекомендациям W3C для Namespaces in XML. XmlTextReader предоставляет следующие функции:

  • Обеспечивает соблюдение правил корректно сформированного XML.

  • XmlTextReader не предоставляет проверку данных.

  • Проверяет, корректно ли оформлены узлы DocumentType. XmlTextReader проверяет DTD на корректность структуры, но не выполняет проверку валидации с использованием DTD.

  • Для узлов, где NodeType равно XmlNodeType.EntityReference, возвращается один пустой узел EntityReference (т. е. свойство Value равно String.Empty).

Замечание

Фактические объявления сущностей в DTD называются Entity узлами. Когда вы ссылаетесь на эти узлы в вашей системе данных, они называются узлами EntityReference.

  • Не развертывает атрибуты по умолчанию.

Поскольку XmlTextReader не выполняет дополнительные проверки, необходимые для валидации данных, он обеспечивает быстрый синтаксический анализ правильности.

Для выполнения проверки данных используйте XmlReader.

Чтобы считывать XML-данные из XmlDocument, используйте XmlNodeReader.

XmlTextReader выбрасывает XmlException при ошибках разбора XML. После возникновения исключения состояние ридера не предсказуемо. Например, тип сообщаемого узла может отличаться от фактического типа текущего узла. Используйте свойство ReadState, чтобы проверить, находится ли читатель в состоянии ошибки.

Вопросы безопасности

Ниже приведены аспекты, которые следует учитывать при использовании XmlTextReader класса.

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

  • Обработка DTD включена по умолчанию. Отключите обработку DTD, если вас беспокоит проблема с отказом в обслуживании или если вы работаете с ненадежными источниками. Установите для свойства DtdProcessing значение Prohibit, чтобы отключить обработку DTD.

    Если у вас включена обработка DTD, можно использовать XmlSecureResolver для ограничения ресурсов, к которым XmlTextReader можно получить доступ. Вы также можете разработать приложение так, чтобы обработка XML была ограничена по времени и памяти. Например, настройте ограничения времени ожидания в приложении ASP.NET.

  • XML-данные могут содержать ссылки на внешние ресурсы, такие как DTD-файл. По умолчанию внешние ресурсы обрабатываются при помощи объекта XmlUrlResolver без учетных данных пользователя. Вы можете защитить это дальше, выполнив одно из следующих действий:

    • Ограничьте ресурсы, к которым XmlTextReader может получить доступ, установив для свойства XmlResolver объект XmlSecureResolver.

    • Не разрешайте XmlReader открывать внешние ресурсы, установив значение XmlResolver для свойства null.

  • XML-данные могут содержать большое количество атрибутов, объявлений пространства имен, вложенных элементов и т. д., для которых требуется значительное время для обработки. Чтобы ограничить размер входных данных, отправляемых в XmlTextReader, создайте пользовательскую реализацию IStream и передайте его XmlTextReader.

  • Этот ReadValueChunk метод можно использовать для обработки больших потоков данных. Этот метод считывает небольшое количество символов за раз вместо выделения одной строки для всего значения.

  • По умолчанию общие сущности не расширяются. Общие сущности расширяются при вызове ResolveEntity метода.