XmlValidatingReader を使用した DTD に基づく検証
更新 : November 2007
文書型定義 (DTD: Document Type Definition) 検証は、W3C (World Wide Web Consortium) 勧告『Extensible Markup Language (XML) 1.0』で定義されている検証制約を使用して実装されます。DTD は、公式の文法を使用して、仕様に準拠する XML ドキュメントの構造と構文を記述しています。つまり、XML ドキュメントで使用できる内容や値を指定しています。
DTD を基準として検証を実行する場合、XmlValidatingReader は、XML ドキュメントの DOCTYPE 宣言で定義されている DTD を使用します。DOCTYPE 宣言では、インラインの DTD を指すか、または外部 DTD ファイルへの参照を指定できます。
メモ : |
---|
.NET Framework version 2.0 では、XmlValidatingReader クラスが廃止されています。XmlReaderSettings クラスと Create メソッドを使用して、検証用の XmlReader インスタンスを作成できます。詳細については、「XmlReader による XML データの検証」を参照してください。 |
例
XmlTextReader を受け取る XmlValidatingReader を作成するコード サンプルを次に示します。外部 DTD ファイル HeadCount.dtd を基準として、入力ファイル HeadCount.xml を検証します。すべてのエラーの種類とエラー メッセージが表示されます。
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema
public class ValidationSample
public shared sub Main()
Dim tr As XmlTextReader = new XmlTextReader("HeadCount.xml")
Dim vr As XmlValidatingReader = new XmlValidatingReader(tr)
vr.ValidationType = ValidationType.DTD
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallback
while(vr.Read())
end while
Console.WriteLine("Validation finished")
end sub
public shared sub ValidationCallBack (sender As object, args As ValidationEventArgs)
Console.WriteLine("***Validation error")
Console.WriteLine("Severity:{0}", args.Severity)
Console.WriteLine("Message:{0}", args.Message)
end sub
end class
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace ValidationSample
{
class Sample
{
public static void Main()
{
XmlTextReader tr = new XmlTextReader("HeadCount.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.DTD;
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);
while(vr.Read());
Console.WriteLine("Validation finished");
}
public static void ValidationHandler(object sender, ValidationEventArgs args)
{
Console.WriteLine("***Validation error");
Console.WriteLine("\tSeverity:{0}", args.Severity);
Console.WriteLine("\tMessage :{0}", args.Message);
}
}
}
検証対象の入力ファイル HeadCount.xml の内容について、次に概略を示します。
<!DOCTYPE HeadCount SYSTEM "HeadCount.dtd">
<HeadCount>
<Name First="Waldo" Last="Pepper">
<Name First="Salt" Last="Pepper" Relation="spouse"/>
<Name First="Red" Last="Pepper" Relation="child"/>
</Name>
<Name First="&MyFirst;" Last="&MyLast;">
<Name First="Sharon" Last="&MyLast;" Relation="spouse"/>
<Name First="Morgan" Last="&MyLast;" Relation="child"/>
<Name First="Shelby" Last="&MyLast;" Relation="child"/>
</Name>
</HeadCount>
検証の基準とする外部 DTD ファイル HeadCount.dtd の内容について、次に概略を示します。
<!ELEMENT HeadCount (Name)*>
<!ELEMENT Name (Name)*>
<!ATTLIST Name First CDATA #REQUIRED>
<!ATTLIST Name Last CDATA #REQUIRED>
<!ATTLIST Name Relation (self | spouse | child) "self">
<!ENTITY MyFirst "Jeff">
<!ENTITY MyLast "Smith">