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


Чтение XML-фрагментов с помощью XmlValidatingReader

Класс XmlValidatingReader может считывать XML-фрагменты, анализируя строку как фрагмент XML.

Примечание

Класс XmlValidatingReader в версии .NET Framework 2.0 устарел.Экземпляр XmlReader для проверки можно создать с помощью класса XmlReaderSettings и метода Create.Дополнительные сведения см. в разделе Проверка XML-данных с помощью XmlReader.

Класс XmlParserContext

Класс XmlParserContext используется для создания объектов XmlValidatingReader с контекстными данными, необходимыми для синтаксического анализа XML-фрагмента или XML-документа.Класс XmlParserContext может предоставлять такие сведения, как используемый объект XmlNameTable, область пространства имен, определение типа документа (DTD), кодировка, а также текущий язык xml:lang и область xml:space.

При создании объекта XmlValidatingReader также необходимо указать тип XML-узла.Тип XML-узла определяет, будут ли данные анализироваться как фрагмент или как XML-документ правильного формата.В следующей таблице перечислены типы узлов и типы данных, которые ожидает синтаксический анализатор.Передача любого другого значения XmlNodeType вызывает исключение ArgumentException.

Тип

Фрагмент содержит

Элемент

Любое допустимое содержимое элементов, включая сочетание элементов, комментариев, инструкций по обработке, данных CDATA и текста.

В качестве первого узла может выступать XML-декларация.Это позволяет указать кодировку XML-фрагмента.

Атрибут

Значение атрибута.

Документ

Содержимое всего XML-документа.Этот тип применяет правильный формат XML-документов.

Ссылки на сущности, найденные в элементе или атрибуте содержимого, обрабатываются согласно флагу EntityHandling.С помощью класса XmlParserContext можно передать данные определения DTD, которые используются для разрешения сущностей, и добавить атрибуты по умолчанию.

Если свойство ValidationType имеет значение DTD или Auto, а разрешение сущностей и добавление атрибутов по умолчанию важно, необходим конструктор XmlParserContext, содержащий литерал PUBLIC, литерал SYSTEM и внутреннее подмножество DTD.Для всех остальных типов проверки конструктор XmlParserContext можно указывать без свойств DTD (например, схем).Любые схемы, используемые для проверки XML-фрагмента, должны либо добавляться в коллекцию XmlSchemaCollection, либо необходимо указывать ссылки на них непосредственно внутри XML-фрагмента.Конструктор XmlParserContext используется для предоставления таких сведений, как разрешение пространства имен, данные определения DTD и так далее, которые необходимы для проведения синтаксического анализа XML-фрагментов.

Исключение ArgumentException возникает, если свойство ValidationType имеет значение DTD, а объект XmlParserContext не содержит ни одного свойства определения DTD.

Пример

В следующем примере кода объект XmlValidatingReader используется для чтения XML-фрагментов и их записи в консоль.

Imports System
Imports System.Xml
 
Public Class Sample
  
   Overloads Public Shared Sub Main(args() As [String])
      Dim vr As New XmlValidatingReader("<element1> abc </element1>  <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, Nothing)
      While vr.Read()
         Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
      End While
   End Sub
   ' Main
End Class
' Sample
using System;
using System.Xml;

public class Sample 
{
  public static void Main (String[] args) 
  {
  XmlValidatingReader vr = new XmlValidatingReader("<element1> abc </element1>  <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, null);
        while(vr.Read())
    Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
   }
}

Следующий пример кода читает XML-фрагмент с помощью конструктора XmlParserContext, чтобы предоставить требуемое пространство имен из объекта XmlNamespaceManager.

Imports System
Imports System.IO
Imports System.Xml
 
Public Class Sample
   
   Public Shared Sub Main()
      
      Dim xmlFrag As String = "<book><bk:genre>&n;</bk:genre></book>"
      Dim nt As New NameTable()
      Dim nsmanager As New XmlNamespaceManager(nt)
      ' Add a default namespace.
      nsmanager.AddNamespace(String.Empty, "www.microsoft.com")
      nsmanager.AddNamespace("bk", "www.microsoft.com/books")
      Dim internalContent As String = "<!ENTITY n 'novel'>"
      Dim context As New XmlParserContext(nt, nsmanager, "elem", Nothing, Nothing, internalContent, String.Empty, String.Empty, XmlSpace.None)
      Dim r As New XmlValidatingReader(xmlFrag, XmlNodeType.Element, context)
      r.ValidationType = ValidationType.None
      r.EntityHandling = EntityHandling.ExpandEntities
      While r.Read()
         Console.WriteLine("{0},{1},{2}", r.NodeType, r.Name, r.Value)
      End While 
   End Sub
   ' Main
End Class
' Sample
using System;
using System.IO;
using System.Xml;

public class Sample 
{
  public static void Main()
  {

      string xmlFrag = "<book><bk:genre>&n;</bk:genre></book>";
      NameTable nt = new NameTable();
      XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
     // Add a default namespace.
     nsmanager.AddNamespace (string.Empty, "www.microsoft.com");
     nsmanager.AddNamespace ("bk", "www.microsoft.com/books");
     string internalContent = "<!ENTITY n 'novel'>";
     XmlParserContext context = new XmlParserContext(nt, nsmanager, "elem",null, null, internalContent, string.Empty,
string.Empty, XmlSpace.None);
     XmlValidatingReader r = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
     r.ValidationType = ValidationType.None;
     r.EntityHandling = EntityHandling.ExpandEntities;
     while(r.Read())
        Console.WriteLine("{0},{1},{2}",r.NodeType, r.Name, r.Value);

  }
}

Синтаксический анализ фрагмента не возможен, если свойство ValidationType имеет значение DTD поскольку, по определению, определение DTD требует, чтобы для проведения проверки был загружен весь документ.

См. также

Основные понятия

Чтение XML с помощью XmlReader

Другие ресурсы

Использование класса XmlReader