Extensions.Validate メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
XDocument、XElement、またはXAttributeがXmlSchemaSetの XSD に準拠していることを検証します。
オーバーロード
| 名前 | 説明 |
|---|---|
| Validate(XDocument, XmlSchemaSet, ValidationEventHandler) |
このメソッドは、 XDocument が XmlSchemaSetの XSD に準拠していることを検証します。 |
| Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
このメソッドは、 XAttribute が指定した XmlSchemaObject と XmlSchemaSetに準拠していることを検証します。 |
| Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean) |
XDocumentがXmlSchemaSetの XSD に準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。 |
| Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
このメソッドは、 XElement サブツリーが指定した XmlSchemaObject と XmlSchemaSetに準拠していることを検証します。 |
| Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
XAttributeが指定したXmlSchemaObjectとXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。 |
| Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
XElementサブツリーが指定したXmlSchemaObjectとXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。 |
注釈
これらのメソッドは、基になる XmlReader を使用して、XSD に対して XML ツリーを検証します。
検証エラーメッセージと警告メッセージは、 ValidationEventHandler デリゲートを使用して処理されます。 これらのメソッドにイベント ハンドラーが指定されていない場合、検証エラーは XmlSchemaValidationExceptionとして公開されます。 検証の警告では、 XmlSchemaValidationException がスローされることはありません。
これらの拡張メソッドの一部では、必要に応じて、スキーマ検証後情報セット (PSVI) の作成を許可します。
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)
このメソッドは、 XDocument が XmlSchemaSetの XSD に準拠していることを検証します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XDocument ^ source, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XDocument * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XDocument, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
パラメーター
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
次の例では、 XmlSchemaSetを作成し、スキーマ セットに対して 2 つの XDocument オブジェクトを検証します。 ドキュメントの 1 つが有効で、もう 1 つは有効ではありません。
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child2", "content1")
)
);
XDocument doc2 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child3", "content1")
)
);
Console.WriteLine("Validating doc1");
bool errors = false;
doc1.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating doc2");
errors = false;
doc2.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child2>content2</Child2>
</Root>
Dim doc2 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors)
Console.WriteLine("doc2 {0}", IIf(errors, "did not validate", "validated"))
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1
doc1 validated
Validating doc2
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.
doc2 did not validate
注釈
この拡張メソッドは、 XDocument が XmlSchemaSetのスキーマ コンテンツ モデルに準拠していることを検証します。
適用対象
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
このメソッドは、 XAttribute が指定した XmlSchemaObject と XmlSchemaSetに準拠していることを検証します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XAttribute ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XAttribute * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XAttribute, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
パラメーター
- source
- XAttribute
検証する XAttribute 。
- partialValidationType
- XmlSchemaObject
検証するサブツリーを指定する XmlSchemaObject 。
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Lang' use='required'>
<xsd:simpleType>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='C#'/>
<xsd:enumeration value='VB'/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XAttribute("Lang", "C#")
)
);
Console.WriteLine("Validating doc1 ...");
bool errors = false;
doc1.Validate(schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating Lang attribute ...");
XAttribute lang = doc1.Root.Attribute("Lang");
errors = false;
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
});
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");
// the following makes the Lang attribute invalid according to the schema
lang.Value = "VC";
Console.WriteLine();
Console.WriteLine("Validating Lang attribute ...");
errors = false;
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
});
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Lang' use='required'>
<xsd:simpleType>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='C#'/>
<xsd:enumeration value='VB'/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root Lang='C#'/>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
Dim lang As XAttribute = doc1.Root.Attribute("Lang")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
' the following makes the Lang attribute invalid according to the schema
lang.Value = "VC"
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1 ...
doc1 validated
Validating Lang attribute ...
lang validated
Validating Lang attribute ...
The 'Lang' attribute is invalid - The value 'VC' is invalid according to its datatype 'Token' - The Enumeration constraint failed.
lang did not validate
注釈
このメソッドを使用して、 XAttribute がスキーマに準拠していることを検証できます。 通常、このメソッドは、属性を変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、属性のみを検証するのにかかる処理時間は短くなります。
nullのvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。
属性を検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。
ドキュメントがスキーマに準拠していることを検証します。
Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。
GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。
XmlSchemaObjectのXElementを取得すると、型がXmlSchemaElementされます。
XmlSchemaObjectのXAttributeを取得すると、型がXmlSchemaAttributeされます。
XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用して属性を検証できます。
適用対象
Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)
XDocumentがXmlSchemaSetの XSD に準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XDocument ^ source, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);
static member Validate : System.Xml.Linq.XDocument * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XDocument, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
パラメーター
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
次の例には、既定値を持つChild2属性を持つAtt1要素を定義する XSD が含まれています。 ドキュメントの検証に成功すると、既定値の属性が XML ツリーに追加されます。 既定の属性は、スキーマに対して検証されない doc2に追加されないことに注意してください。
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Att1' default='Att1 Default Value'/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XElement("Child1", "c1"),
new XElement("Child2", "c2")
)
);
XDocument doc2 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child3", "content1")
)
);
Console.WriteLine("Validating doc1");
bool errors = false;
doc1.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating doc2");
errors = false;
doc2.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
}, true);
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Contents of doc1:");
Console.WriteLine(doc1);
Console.WriteLine();
Console.WriteLine("Contents of doc2:");
Console.WriteLine(doc2);
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Att1' default='Att1 Default Value'/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root>
<Child1>c1</Child1>
<Child2>c2</Child2>
</Root>
Dim doc2 As XDocument = <?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc2 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Contents of doc1:")
Console.WriteLine(doc1)
Console.WriteLine()
Console.WriteLine("Contents of doc2:")
Console.WriteLine(doc2)
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1
doc1 validated
Validating doc2
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.
doc2 did not validate
Contents of doc1:
<Root>
<Child1>c1</Child1>
<Child2 Att1="Att1 Default Value">c2</Child2>
</Root>
Contents of doc2:
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
次の例では、ツリーに PSVI を設定します。 検証後、PSVI に従って無効なすべての要素と属性がツリーに出力されます。
static void DumpInvalidNodes(XElement el)
{
if (el.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
Console.WriteLine("Invalid Element {0}",
el.AncestorsAndSelf()
.InDocumentOrder()
.Aggregate("", (s, i) => s + "/" + i.Name.ToString()));
foreach (XAttribute att in el.Attributes())
if (att.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
Console.WriteLine("Invalid Attribute {0}",
att
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Aggregate("",
(s, i) => s + "/" + i.Name.ToString()) + "/@" + att.Name.ToString()
);
foreach (XElement child in el.Elements())
DumpInvalidNodes(child);
}
static void Main(string[] args)
{
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:simpleType name='GCType'>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='AAA'/>
<xsd:enumeration value='BBB'/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='GrandChild1' type='GCType'/>
<xsd:element name='GrandChild2' type='GCType'/>
<xsd:element name='GrandChild3' type='GCType'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XElement("Child1",
new XElement("GrandChild1", "AAA"),
new XElement("GrandChild2", "ZZZ"),
new XElement("GrandChild3", "ZZZ")
)
)
);
Console.WriteLine("Validating doc1 ...");
bool errors = false;
doc1.Validate(schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
DumpInvalidNodes(doc1.Root);
}
Private Sub DumpInvalidNodes(ByVal el As XElement)
If el.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Element {0}", _
el _
.AncestorsAndSelf _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()))
End If
For Each att As XAttribute In el.Attributes()
If att.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Attribute {0}", _
att _
.Parent _
.AncestorsAndSelf() _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()) + _
"/@" + att.Name.ToString())
End If
Next
For Each child As XElement In el.Elements()
DumpInvalidNodes(child)
Next
End Sub
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:simpleType name='GCType'>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='AAA'/>
<xsd:enumeration value='BBB'/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='GrandChild1' type='GCType'/>
<xsd:element name='GrandChild2' type='GCType'/>
<xsd:element name='GrandChild3' type='GCType'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>
<GrandChild1>AAA</GrandChild1>
<GrandChild2>ZZZ</GrandChild2>
<GrandChild3>ZZZ</GrandChild3>
</Child1>
</Root>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1 ...
The 'GrandChild2' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed.
The 'GrandChild3' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed.
doc1 did not validate
Invalid Element /Root
Invalid Element /Root/Child1
Invalid Element /Root/Child1/GrandChild2
Invalid Element /Root/Child1/GrandChild3
注釈
この拡張メソッドは、 XDocument が XmlSchemaSetのスキーマ コンテンツ モデルに準拠していることを検証します。
addSchemaInfoがtrueされている場合、このメソッドは XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。
PSVI を使用して XML ツリーを設定するには、2 つの手順があります。
まず、ツリー内のすべてのノードに注釈が追加され、ツリー内の要素または属性に対して Extensions.GetSchemaInfo または Extensions.GetSchemaInfo を呼び出せるようにします。
次に、XSD で定義されている既定の要素と属性が XML ツリーに追加されます。 GetSchemaInfo メソッドのいずれかを呼び出すことで、XSD から既定の要素または属性として特定の要素または属性が追加されたかどうかを判断できます。
適用対象
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
このメソッドは、 XElement サブツリーが指定した XmlSchemaObject と XmlSchemaSetに準拠していることを検証します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XElement ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XElement * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XElement, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
パラメーター
- partialValidationType
- XmlSchemaObject
検証するサブツリーを指定する XmlSchemaObject 。
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='GrandChild1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='GrandChild2' minOccurs='1' maxOccurs='2'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XElement("Child1",
new XElement("GrandChild1", "gc"),
new XElement("GrandChild2", "gc")
)
)
);
Console.WriteLine("Validating doc1 ...");
bool errors = false;
doc1.Validate(schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating Child1 after first edit ...");
XElement child1 = doc1.Element("Root").Element("Child1");
child1.Add(new XElement("GrandChild2", "gc"));
errors = false;
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
});
Console.WriteLine("child1 {0}", errors ? "did not validate" : "validated");
// the following makes the Child1 element invalid according to the schema
child1.Add(new XElement("GrandChild3", "gc"));
Console.WriteLine();
Console.WriteLine("Validating Child1 after second edit ...");
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
});
Console.WriteLine("child1 {0}", errors ? "did not validate" : "validated");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='GrandChild1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='GrandChild2' minOccurs='1' maxOccurs='2'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>
<GrandChild1>gc</GrandChild1>
<GrandChild2>gc</GrandChild2>
</Child1>
</Root>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating Child1 after first edit ...")
Dim child1 As XElement = doc1.Element("Root").Element("Child1")
child1.Add(<GrandChild2>gc</GrandChild2>)
errors = False
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, AddressOf XSDErrors)
Console.WriteLine("child1 {0}", IIf(errors, "did not validate", "validated"))
' the following makes the Child1 element invalid according to the schema
child1.Add(<GrandChild3>gc</GrandChild3>)
Console.WriteLine()
Console.WriteLine("Validating Child1 after second edit ...")
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, AddressOf XSDErrors)
Console.WriteLine("child1 {0}", IIf(errors, "did not validate", "validated"))
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1 ...
doc1 validated
Validating Child1 after first edit ...
child1 validated
Validating Child1 after second edit ...
The element 'Child1' has invalid child element 'GrandChild3'.
child1 did not validate
注釈
このメソッドを使用して、サブツリー (ルートに XElement ) がスキーマに準拠していることを検証できます。 通常、このメソッドは、サブツリーを変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、サブツリーのみを検証するのにかかる処理時間は短くなります。
nullのvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。
サブツリーを検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。
ドキュメントがスキーマに準拠していることを検証します。
Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。
GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。
XmlSchemaObjectのXElementを取得すると、型がXmlSchemaElementされます。
XmlSchemaObjectのXAttributeを取得すると、型がXmlSchemaAttributeされます。
XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用してサブツリーを検証できます。
適用対象
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
XAttributeが指定したXmlSchemaObjectとXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XAttribute ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);
static member Validate : System.Xml.Linq.XAttribute * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XAttribute, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
パラメーター
- source
- XAttribute
検証する XAttribute 。
- partialValidationType
- XmlSchemaObject
検証するサブツリーを指定する XmlSchemaObject 。
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
static void DumpInvalidNodes(XElement el)
{
if (el.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
Console.WriteLine("Invalid Element {0}",
el.AncestorsAndSelf()
.InDocumentOrder()
.Aggregate("", (s, i) => s + "/" + i.Name.ToString()));
foreach (XAttribute att in el.Attributes())
if (att.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
Console.WriteLine("Invalid Attribute {0}",
att
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Aggregate("",
(s, i) => s + "/" + i.Name.ToString()) + "/@" + att.Name.ToString()
);
foreach (XElement child in el.Elements())
DumpInvalidNodes(child);
}
static void Main(string[] args)
{
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Lang' use='required'>
<xsd:simpleType>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='C#'/>
<xsd:enumeration value='VB'/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XAttribute("Lang", "C#")
)
);
Console.WriteLine("Validating doc1 ...");
bool errors = false;
doc1.Validate(schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
DumpInvalidNodes(doc1.Root);
Console.WriteLine();
Console.WriteLine("Validating Lang attribute ...");
XAttribute lang = doc1.Element("Root").Attribute("Lang");
errors = false;
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");
DumpInvalidNodes(doc1.Root);
// the following makes the Lang attribute invalid according to the schema
lang.Value = "VC";
Console.WriteLine();
Console.WriteLine("Validating Lang attribute ...");
errors = false;
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>
{
Console.WriteLine(e.Message);
errors = true;
}, true);
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");
DumpInvalidNodes(doc1.Root);
}
Private Sub DumpInvalidNodes(ByVal el As XElement)
If el.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Element {0}", _
el _
.AncestorsAndSelf _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()))
End If
For Each att As XAttribute In el.Attributes()
If att.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Attribute {0}", _
att _
.Parent _
.AncestorsAndSelf() _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()) + _
"/@" + att.Name.ToString())
End If
Next
For Each child As XElement In el.Elements()
DumpInvalidNodes(child)
Next
End Sub
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Lang' use='required'>
<xsd:simpleType>
<xsd:restriction base='xsd:token'>
<xsd:enumeration value='C#'/>
<xsd:enumeration value='VB'/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root Lang='C#'/>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
Dim lang As XAttribute = doc1.Element("Root").Attribute("Lang")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors, True)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
' the following makes the Lang attribute invalid according to the schema
lang.Value = "VC"
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors, True)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1 ...
doc1 validated
Validating Lang attribute ...
lang validated
Validating Lang attribute ...
The 'Lang' attribute is invalid - The value 'VC' is invalid according to its datatype 'Token' - The Enumeration constraint failed.
lang did not validate
Invalid Attribute /Root/@Lang
注釈
このメソッドを使用して、 XAttribute がスキーマに準拠していることを検証できます。 通常、このメソッドは、属性を変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、属性のみを検証するのにかかる処理時間は短くなります。
addSchemaInfoがtrueされている場合、このメソッドは属性にスキーマ検証後情報セット (PSVI) を設定します。 XML ツリーに PSVI を設定したら、検証済みの属性に対して Extensions.GetSchemaInfo を呼び出すことができます。 これは、 GetSchemaInfoによって返されるデータに依存するコードを記述する場合に便利です。
nullのvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。
属性を検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。
ドキュメントがスキーマに準拠していることを検証します。
Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。
GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。
XmlSchemaObjectのXElementを取得すると、型がXmlSchemaElementされます。
XmlSchemaObjectのXAttributeを取得すると、型がXmlSchemaAttributeされます。
XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用して属性を検証できます。
適用対象
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
XElementサブツリーが指定したXmlSchemaObjectとXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XElement ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);
static member Validate : System.Xml.Linq.XElement * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XElement, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
パラメーター
- partialValidationType
- XmlSchemaObject
検証するサブツリーを指定する XmlSchemaObject 。
- schemas
- XmlSchemaSet
検証対象の XmlSchemaSet 。
- validationEventHandler
- ValidationEventHandler
リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandler 。
null場合は、検証エラー時に例外がスローされます。
例外
XML スキーマ定義言語 (XSD) 検証エラーに対してスローされます。
例
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Att1' default='Att1 Default Value'/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("Root",
new XElement("Child1", "c1"),
new XElement("Child2", "c2")
)
);
XDocument doc2 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child3", "content1")
)
);
Console.WriteLine("Validating doc1");
bool errors = false;
doc1.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating doc2");
errors = false;
doc2.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
}, true);
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Contents of doc1:");
Console.WriteLine(doc1);
Console.WriteLine();
Console.WriteLine("Contents of doc2:");
Console.WriteLine(doc2);
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base='xsd:string'>
<xsd:attribute name='Att1' default='Att1 Default Value'/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>c1</Child1>
<Child2>c2</Child2>
</Root>
Dim doc2 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc2 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Contents of doc1:")
Console.WriteLine(doc1)
Console.WriteLine()
Console.WriteLine("Contents of doc2:")
Console.WriteLine(doc2)
End Sub
この例を実行すると、次の出力が生成されます。
Validating doc1
doc1 validated
Validating doc2
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.
doc2 did not validate
Contents of doc1:
<Root>
<Child1>c1</Child1>
<Child2 Att1="Att1 Default Value">c2</Child2>
</Root>
Contents of doc2:
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
注釈
このメソッドを使用すると、サブツリー (サブツリーのルートに XElement ) がスキーマに準拠していることを検証できます。 通常、このメソッドは、サブツリーを変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、サブツリーのみを検証するのにかかる処理時間は短くなります。
addSchemaInfoがtrueされている場合、このメソッドは XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。
PSVI を使用して XML ツリーを設定する場合、2 つの側面があります。
まず、ツリー内のすべてのノードに注釈が追加され、ツリー内の要素または属性に対して GetSchemaInfo を呼び出すことができます。
次に、XSD で定義されている既定の要素と属性が XML ツリーに追加されます。 GetSchemaInfo メソッドのいずれかを呼び出すことで、XSD から既定の要素または属性として特定の要素または属性が追加されたかどうかを判断できます。
nullのvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。
サブツリーを検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。
ドキュメントがスキーマに準拠していることを検証します。
Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。
GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。
XmlSchemaObjectのXElementを取得すると、型がXmlSchemaElementされます。
XmlSchemaObjectのXAttributeを取得すると、型がXmlSchemaAttributeされます。
XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用してサブツリーを検証できます。