XmlValidatingReader を使用した XML フラグメントの読み込み
更新 : November 2007
XmlValidatingReader クラスは、文字列を XML のフラグメントとして解析することにより、XML フラグメントを読み取ることができます。
メモ : |
---|
.NET Framework version 2.0 では、XmlValidatingReader クラスが廃止されています。XmlReaderSettings クラスと Create メソッドを使用して、検証用の XmlReader インスタンスを作成できます。詳細については、「XmlReader による XML データの検証」を参照してください。 |
XmlParserContext クラス
XmlParserContext クラスは、XML フラグメントまたは XML ドキュメントの解析に必要なコンテキスト情報を持った XmlValidatingReader オブジェクトの作成に使用されます。XmlParserContext クラスは、使用する XmlNameTable、名前空間スコープ、ドキュメント型定義 (DTD)、エンコーディング、現在の xml:lang スコープおよび xml:space スコープなどの情報を提供できます。
XmlValidatingReader オブジェクトを作成するときは、XML ノード型も指定する必要があります。XML ノード型によって、データがフラグメントとして解析されるか、整形式の XML ドキュメントとして解析されるかが決まります。ノード型の一覧と、パーサーが予想するデータの型を次の表に示します。この表に示す値以外の XmlNodeType 値を渡すと、ArgumentException がスローされます。
型 |
フラグメントの内容 |
---|---|
Element |
要素、コメント、処理命令、CDATA、およびテキストの組み合わせを含む、有効な要素コンテンツ。 XML 宣言が最初のノードになることもあります。その場合は、XML フラグメントのエンコーディングを指定できます。 |
Attribute |
属性の値。 |
Document |
XML ドキュメント全体のコンテンツ。この型を指定すると、XML 整形式ドキュメントの規則が適用されます。 |
要素や属性の内容に含まれるエンティティ参照は、EntityHandling フラグに基づいて処理されます。エンティティの解決や既定の属性の追加に使用する DTD 情報を渡すには、XmlParserContext クラスを使用します。
ValidationType プロパティが DTD または Auto に設定されている状態で、エンティティを解決したり、既定の属性を追加したりする必要がある場合は、PUBLIC リテラル、SYSTEM リテラル、および内部の 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
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
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);
}
}
定義上、DTD ではドキュメント全体が読み込まれいないと検証を実行できないため、ValidationType プロパティが DTD に設定されている場合、フラグメントの解析は不可能です。