Extensions.Validate メソッド

定義

XDocumentXElement、またはXAttributeXmlSchemaSetの XSD に準拠していることを検証します。

オーバーロード

名前 説明
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

このメソッドは、 XDocumentXmlSchemaSetの XSD に準拠していることを検証します。

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

このメソッドは、 XAttribute が指定した XmlSchemaObjectXmlSchemaSetに準拠していることを検証します。

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

XDocumentXmlSchemaSetの XSD に準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

このメソッドは、 XElement サブツリーが指定した XmlSchemaObjectXmlSchemaSetに準拠していることを検証します。

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

XAttributeが指定したXmlSchemaObjectXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

XElementサブツリーが指定したXmlSchemaObjectXmlSchemaSetに準拠していることを検証します。必要に応じて、XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。

注釈

これらのメソッドは、基になる XmlReader を使用して、XSD に対して XML ツリーを検証します。

検証エラーメッセージと警告メッセージは、 ValidationEventHandler デリゲートを使用して処理されます。 これらのメソッドにイベント ハンドラーが指定されていない場合、検証エラーは XmlSchemaValidationExceptionとして公開されます。 検証の警告では、 XmlSchemaValidationException がスローされることはありません。

これらの拡張メソッドの一部では、必要に応じて、スキーマ検証後情報セット (PSVI) の作成を許可します。

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

このメソッドは、 XDocumentXmlSchemaSetの 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)

パラメーター

source
XDocument

検証する XDocument

schemas
XmlSchemaSet

検証対象の XmlSchemaSet

validationEventHandler
ValidationEventHandler

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

例外

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

注釈

この拡張メソッドは、 XDocumentXmlSchemaSetのスキーマ コンテンツ モデルに準拠していることを検証します。

適用対象

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

このメソッドは、 XAttribute が指定した XmlSchemaObjectXmlSchemaSetに準拠していることを検証します。

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

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

例外

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 がスキーマに準拠していることを検証できます。 通常、このメソッドは、属性を変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、属性のみを検証するのにかかる処理時間は短くなります。

nullvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。

属性を検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。

  1. ドキュメントがスキーマに準拠していることを検証します。

  2. Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。

  3. GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。

XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用して属性を検証できます。

適用対象

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

XDocumentXmlSchemaSetの 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)

パラメーター

source
XDocument

検証する XDocument

schemas
XmlSchemaSet

検証対象の XmlSchemaSet

validationEventHandler
ValidationEventHandler

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

addSchemaInfo
Boolean

スキーマ検証後のインフォセット (PSVI) を設定するかどうかを示す Boolean

例外

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

注釈

この拡張メソッドは、 XDocumentXmlSchemaSetのスキーマ コンテンツ モデルに準拠していることを検証します。

addSchemaInfotrueされている場合、このメソッドは XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。

PSVI を使用して XML ツリーを設定するには、2 つの手順があります。

  1. まず、ツリー内のすべてのノードに注釈が追加され、ツリー内の要素または属性に対して Extensions.GetSchemaInfo または Extensions.GetSchemaInfo を呼び出せるようにします。

  2. 次に、XSD で定義されている既定の要素と属性が XML ツリーに追加されます。 GetSchemaInfo メソッドのいずれかを呼び出すことで、XSD から既定の要素または属性として特定の要素または属性が追加されたかどうかを判断できます。

適用対象

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

このメソッドは、 XElement サブツリーが指定した XmlSchemaObjectXmlSchemaSetに準拠していることを検証します。

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)

パラメーター

source
XElement

検証する XElement

partialValidationType
XmlSchemaObject

検証するサブツリーを指定する XmlSchemaObject

schemas
XmlSchemaSet

検証対象の XmlSchemaSet

validationEventHandler
ValidationEventHandler

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

例外

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 ) がスキーマに準拠していることを検証できます。 通常、このメソッドは、サブツリーを変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、サブツリーのみを検証するのにかかる処理時間は短くなります。

nullvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。

サブツリーを検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。

  1. ドキュメントがスキーマに準拠していることを検証します。

  2. Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。

  3. GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。

XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用してサブツリーを検証できます。

適用対象

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

XAttributeが指定したXmlSchemaObjectXmlSchemaSetに準拠していることを検証します。必要に応じて、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

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

addSchemaInfo
Boolean

スキーマ検証後のインフォセット (PSVI) を設定するかどうかを示す Boolean

例外

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 がスキーマに準拠していることを検証できます。 通常、このメソッドは、属性を変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、属性のみを検証するのにかかる処理時間は短くなります。

addSchemaInfotrueされている場合、このメソッドは属性にスキーマ検証後情報セット (PSVI) を設定します。 XML ツリーに PSVI を設定したら、検証済みの属性に対して Extensions.GetSchemaInfo を呼び出すことができます。 これは、 GetSchemaInfoによって返されるデータに依存するコードを記述する場合に便利です。

nullvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。

属性を検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。

  1. ドキュメントがスキーマに準拠していることを検証します。

  2. Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。

  3. GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。

XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用して属性を検証できます。

適用対象

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs
ソース:
XNodeValidator.cs

XElementサブツリーが指定したXmlSchemaObjectXmlSchemaSetに準拠していることを検証します。必要に応じて、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)

パラメーター

source
XElement

検証する XElement

partialValidationType
XmlSchemaObject

検証するサブツリーを指定する XmlSchemaObject

schemas
XmlSchemaSet

検証対象の XmlSchemaSet

validationEventHandler
ValidationEventHandler

リーダーが検証エラーを検出したときに発生するイベントの ValidationEventHandlernull場合は、検証エラー時に例外がスローされます。

addSchemaInfo
Boolean

スキーマ検証後のインフォセット (PSVI) を設定するかどうかを示す Boolean

例外

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 ) がスキーマに準拠していることを検証できます。 通常、このメソッドは、サブツリーを変更し、そのスキーマに準拠していることを確認する場合に使用します。 ドキュメント全体を検証することもできますが、サブツリーのみを検証するのにかかる処理時間は短くなります。

addSchemaInfotrueされている場合、このメソッドは XML ツリーにスキーマ検証後情報セット (PSVI) を設定します。

PSVI を使用して XML ツリーを設定する場合、2 つの側面があります。

まず、ツリー内のすべてのノードに注釈が追加され、ツリー内の要素または属性に対して GetSchemaInfo を呼び出すことができます。

次に、XSD で定義されている既定の要素と属性が XML ツリーに追加されます。 GetSchemaInfo メソッドのいずれかを呼び出すことで、XSD から既定の要素または属性として特定の要素または属性が追加されたかどうかを判断できます。

nullvalidationEventHandlerを渡すと、このメソッドは検証エラー時に例外を発生させます。 検証の警告では例外は発生しません。

サブツリーを検証するには、 XmlSchemaObjectのインスタンスを使用します。 このインスタンスは、さまざまな方法で取得できます。 簡単な方法は次のとおりです。

  1. ドキュメントがスキーマに準拠していることを検証します。

  2. Validate拡張メソッドを呼び出して、スキーマ検証後の情報セット (PSVI) を追加します。

  3. GetSchemaInfo拡張メソッドを呼び出して、IXmlSchemaInfoを実装するオブジェクトを取得します。 取得したオブジェクトから、 XmlSchemaObjectを取得できます。

XmlSchemaObjectのインスタンスを作成したら、このメソッドを使用してサブツリーを検証できます。

適用対象