Extensions.Validate Método

Definição

Valida que um XDocument, um XElementou um XAttribute está em conformidade com um XSD em um XmlSchemaSet.

Sobrecargas

Nome Description
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Esse método valida que um XDocument XSD está em XmlSchemaSetconformidade com um .

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Esse método valida que um XAttribute está em conformidade com um especificado XmlSchemaObject e um XmlSchemaSet.

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Valida se um XDocument XSD está em conformidade com um XSD em uma XmlSchemaSetárvore XML, opcionalmente populando a árvore XML com o conjunto de informações pós-validação de esquema (PSVI).

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Esse método valida que uma XElement subárvore está em conformidade com uma especificada XmlSchemaObject e uma XmlSchemaSet.

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

Valida se um está XAttribute em conformidade com um especificado XmlSchemaObject e um XmlSchemaSet, opcionalmente, preenchendo a árvore XML com o conjunto de informações pós-validação de esquema (PSVI).

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

Valida se uma XElement subárvore está em conformidade com um especificado XmlSchemaObject e um XmlSchemaSet, opcionalmente, populando a árvore XML com o conjunto de informações pós-validação de esquema (PSVI).

Comentários

Esses métodos usam um subjacente XmlReader para validar a árvore XML em relação a um XSD.

O erro de validação e as mensagens de aviso são tratados usando o ValidationEventHandler delegado. Se nenhum manipulador de eventos for fornecido a esses métodos, os erros de validação serão expostos como um XmlSchemaValidationException. Avisos de validação não fazem com que um XmlSchemaValidationException seja gerado.

Alguns desses métodos de extensão opcionalmente permitem a população do conjunto de informações pós-validação de esquema (PSVI).

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Esse método valida que um XDocument XSD está em XmlSchemaSetconformidade com um .

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);
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)

Parâmetros

source
XDocument

O XDocument para validar.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

O exemplo a seguir cria um XmlSchemaSete valida dois XDocument objetos no conjunto de esquemas. Um dos documentos é válido, o outro não.

                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

Este exemplo produz a seguinte saída:

Validating doc1
doc1 validated

Validating doc2
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.
doc2 did not validate

Comentários

Esse método de extensão valida que o XDocument modelo de conteúdo do esquema está em XmlSchemaSetconformidade.

Aplica-se a

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Esse método valida que um XAttribute está em conformidade com um especificado XmlSchemaObject e um 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);
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)

Parâmetros

source
XAttribute

O XAttribute para validar.

partialValidationType
XmlSchemaObject

Um XmlSchemaObject que especifica a subárvore a ser validada.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

                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

Este exemplo produz a seguinte saída:

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

Comentários

Você pode usar esse método para validar que um está XAttribute em conformidade com um esquema. Normalmente, você usa esse método quando modifica um atributo e deseja garantir que ele ainda esteja em conformidade com seu esquema. Você pode validar todo o documento, mas leva menos tempo de processamento para validar apenas o atributo.

Se você passar null , validationEventHandleresse método gerará uma exceção após erros de validação. Os avisos de validação não gerarão uma exceção.

Para validar um atributo, use uma instância de XmlSchemaObject. Você pode obter essa instância de várias maneiras. Uma maneira fácil é a seguinte:

  1. Valide se um documento está em conformidade com um esquema.

  2. Adicione o conjunto de informações pós-validação de esquema (PSVI) chamando o método de Validate extensão.

  3. Chame o GetSchemaInfo método de extensão para recuperar um objeto que implementa IXmlSchemaInfo. No objeto recuperado, você pode obter um XmlSchemaObject.

Depois de ter uma instância de um XmlSchemaObject, você pode usar esse método para validar um atributo.

Aplica-se a

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Valida se um XDocument XSD está em conformidade com um XSD em uma XmlSchemaSetárvore XML, opcionalmente populando a árvore XML com o conjunto de informações pós-validação de esquema (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);
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)

Parâmetros

source
XDocument

O XDocument para validar.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

addSchemaInfo
Boolean

Um Boolean que indica se o conjunto de informações pós-validação de esquema (PSVI) deve ser preenchido.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

O exemplo a seguir contém um XSD que define o Child2 elemento com um Att1 atributo com um valor padrão. Depois de validar com êxito o documento, o atributo com o valor padrão é adicionado à árvore XML. Observe que o atributo padrão não é adicionado, doc2que não é validado em relação ao esquema.

                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

Este exemplo produz a seguinte saída:

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>

O exemplo a seguir popula a árvore com o PSVI. Após a validação, ele imprime todos os elementos e atributos na árvore que são inválidos de acordo com oVVI.

                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

Este exemplo produz a seguinte saída:

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

Comentários

Esse método de extensão valida que o XDocument modelo de conteúdo do esquema está em XmlSchemaSetconformidade.

Se addSchemaInfo for true, esse método popula a árvore XML com o conjunto de informações pós-validação de esquema (PSVI).

Há duas etapas para preencher a árvore XML com o PSVI.

  1. Primeiro, uma anotação é adicionada a todos os nós na árvore para permitir que você chame Extensions.GetSchemaInfo ou Extensions.GetSchemaInfo em um elemento ou atributo na árvore.

  2. Em segundo lugar, os elementos e atributos padrão definidos no XSD são adicionados à árvore XML. Ao chamar um dos GetSchemaInfo métodos, você pode determinar se um elemento ou atributo específico foi adicionado do XSD como um elemento ou atributo padrão.

Aplica-se a

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Esse método valida que uma XElement subárvore está em conformidade com uma especificada XmlSchemaObject e uma 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);
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)

Parâmetros

source
XElement

O XElement para validar.

partialValidationType
XmlSchemaObject

Um XmlSchemaObject que especifica a subárvore a ser validada.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

                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

Este exemplo produz a seguinte saída:

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

Comentários

Você pode usar esse método para validar que uma subárvore (com uma XElement em sua raiz) está em conformidade com um esquema. Normalmente, você usa esse método quando modifica uma subárvore e deseja garantir que ele ainda esteja em conformidade com seu esquema. Você pode validar todo o documento, mas leva menos tempo de processamento para validar apenas uma subárvore.

Se você passar null , validationEventHandleresse método gerará uma exceção após erros de validação. Os avisos de validação não gerarão uma exceção.

Para validar uma subárvore, use uma instância de XmlSchemaObject. Você pode obter essa instância de várias maneiras. Uma maneira fácil é a seguinte:

  1. Valide se um documento está em conformidade com um esquema.

  2. Adicione o conjunto de informações pós-validação de esquema (PSVI) chamando o método de Validate extensão.

  3. Chame o GetSchemaInfo método de extensão para recuperar um objeto que implementa IXmlSchemaInfo. No objeto recuperado, você pode obter um XmlSchemaObject.

Depois de ter uma instância de um XmlSchemaObject, você pode usar esse método para validar uma subárvore.

Aplica-se a

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

Valida se um está XAttribute em conformidade com um especificado XmlSchemaObject e um XmlSchemaSet, opcionalmente, preenchendo a árvore XML com o conjunto de informações pós-validação de esquema (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);
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)

Parâmetros

source
XAttribute

O XAttribute para validar.

partialValidationType
XmlSchemaObject

Um XmlSchemaObject que especifica a subárvore a ser validada.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

addSchemaInfo
Boolean

Um Boolean que indica se o conjunto de informações pós-validação de esquema (PSVI) deve ser preenchido.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

                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

Este exemplo produz a seguinte saída:

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

Comentários

Você pode usar esse método para validar que um está XAttribute em conformidade com um esquema. Normalmente, você usa esse método quando modifica um atributo e deseja garantir que ele ainda esteja em conformidade com seu esquema. Você pode validar todo o documento, mas leva menos tempo de processamento para validar apenas o atributo.

Se addSchemaInfo for true, esse método preencherá o atributo com o conjunto de informações pós-validação de esquema (PSVI). Depois de preencher a árvore XML com oVVI, você poderá chamar Extensions.GetSchemaInfo o atributo validado. Isso será útil se você estiver escrevendo um código que dependa de dados retornados por GetSchemaInfo.

Se você passar null , validationEventHandleresse método gerará uma exceção após erros de validação. Os avisos de validação não gerarão uma exceção.

Para validar um atributo, use uma instância de XmlSchemaObject. Você pode obter essa instância de várias maneiras. Uma maneira fácil é a seguinte:

  1. Valide se um documento está em conformidade com um esquema.

  2. Adicione o conjunto de informações pós-validação de esquema (PSVI) chamando o método de Validate extensão.

  3. Chame o GetSchemaInfo método de extensão para recuperar um objeto que implementa IXmlSchemaInfo. No objeto recuperado, você pode obter um XmlSchemaObject.

Depois de ter uma instância de um XmlSchemaObject, você pode usar esse método para validar um atributo.

Aplica-se a

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

Valida se uma XElement subárvore está em conformidade com um especificado XmlSchemaObject e um XmlSchemaSet, opcionalmente, populando a árvore XML com o conjunto de informações pós-validação de esquema (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);
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)

Parâmetros

source
XElement

O XElement para validar.

partialValidationType
XmlSchemaObject

Um XmlSchemaObject que especifica a subárvore a ser validada.

schemas
XmlSchemaSet

Um XmlSchemaSet para validar.

validationEventHandler
ValidationEventHandler

A ValidationEventHandler para um evento que ocorre quando o leitor encontra erros de validação. Se null, gerará uma exceção após erros de validação.

addSchemaInfo
Boolean

Um Boolean que indica se o conjunto de informações pós-validação de esquema (PSVI) deve ser preenchido.

Exceções

Gerado para erros de validação XSD (Linguagem de Definição de Esquema XML).

Exemplos

                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

Este exemplo produz a seguinte saída:

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>

Comentários

Você pode usar esse método para validar que uma subárvore (com uma XElement na raiz da subárvore) está em conformidade com um esquema. Normalmente, você usa esse método quando modifica uma subárvore e deseja garantir que ele ainda esteja em conformidade com seu esquema. Você pode validar todo o documento, mas leva menos tempo de processamento para validar apenas uma subárvore.

Se addSchemaInfo for true, esse método preencherá a árvore XML com o conjunto de informações pós-validação de esquema (PSVI).

Há dois aspectos de população da árvore XML com o PSVI.

Primeiro, uma anotação é adicionada a todos os nós na árvore, de modo que agora você pode chamar GetSchemaInfo um elemento ou atributo na árvore.

Em segundo lugar, os elementos e atributos padrão definidos no XSD são adicionados à árvore XML. Ao chamar um dos GetSchemaInfo métodos, você pode determinar se um elemento ou atributo específico foi adicionado do XSD como um elemento ou atributo padrão.

Se você passar null , validationEventHandleresse método gerará uma exceção após erros de validação. Os avisos de validação não gerarão uma exceção.

Para validar uma subárvore, use uma instância de XmlSchemaObject. Você pode obter essa instância de várias maneiras. Uma maneira fácil é a seguinte:

  1. Valide se um documento está em conformidade com um esquema.

  2. Adicione o conjunto de informações pós-validação de esquema (PSVI) chamando o método de Validate extensão.

  3. Chame o GetSchemaInfo método de extensão para recuperar um objeto que implementa IXmlSchemaInfo. No objeto recuperado, você pode obter um XmlSchemaObject.

Depois de ter uma instância de um XmlSchemaObject, você pode usar esse método para validar uma subárvore.

Aplica-se a