XmlValidatingReader を使用した XML フラグメントの読み込み

XmlValidatingReader クラスでは、特定の文字列を XML のフラグメントとして解析することによって XML フラグメントを読み取ることができます。これにより、整形式の XML ドキュメントのルート レベルの規則を無視できるようになります。

XmlValidatingReader はドキュメント フラグメントを構築するために使用されるクラスですが、XmlTextReader はそれに相当する検証用のクラスです。XmlNodeType パラメータの指定によって、特定の文字列の解析方法が決まります。指定できる各型の解析方法について次の表に示します。

フラグメントの内容
Element 要素、コメント、処理命令、CDATA、およびテキストの組み合わせを含む、有効な要素コンテンツ。
Attribute 属性の値。
Document XML ドキュメント全体のコンテンツ。この型を指定すると、ルート レベルの規則が適用されます。

要素や属性の内容に含まれるエンティティ参照は、EntityHandling フラグに基づいて処理されます。エンティティを解決したり、既定の属性を追加したりするために使用される文書型定義 (DTD: Document Type Definition) 情報を渡すためには、XmlParserContext クラスを使用します。他の XmlNodeType 列挙型をとおして情報を渡すと、ArgumentException がスローされます。

ValidationType プロパティが DTD または Auto に設定されているときに、エンティティを解決したり、既定の属性を追加したりする必要がある場合は、パブリック、リテラル、システム リテラル、および内部の DTD サブセットを含む XmlParserContext コンストラクタが必要です。他のすべての検証の種類では、DTD プロパティを含まない XmlParserContext (スキーマなど) を指定できます。XML フラグメントの検証に使用するすべてのスキーマは、XmlSchemaCollection 内に既に追加されているか、またはその XML フラグメント内で直接参照されている必要があります。名前空間解決や DTD 情報など、XML フラグメントを解析するために必要な情報を提供するには、XmlParserContext を使用します。

ValidationType プロパティが DTD に設定されており、XmlParserContext が、どの DTD プロパティも保持していない場合は、ArgumentException が発生します。

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
[C#]
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);
   }
}

XmlParserContext を使用して XML フラグメントを読み取り、必要な名前空間を 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
[C#]
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 は検証を実行するためにドキュメント全体の読み込みを必要とするため、フラグメントを解析できません。

参照

XmlValidatingReader を使用した XML の検証 | スキーマとの XML の検証 | スキーマ キャッシュとしての XmlSchemaCollection | XmlParserContext クラス