Extensions.Validate Metodo

Definizione

Verifica che un oggetto XDocument, XElementun oggetto o sia XAttribute conforme a un XSD in un oggetto XmlSchemaSet.

Overload

Nome Descrizione
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Questo metodo convalida che un oggetto XDocument è conforme a un XSD in un oggetto XmlSchemaSet.

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Questo metodo convalida che un oggetto XAttribute è conforme a un oggetto specificato XmlSchemaObject e a un oggetto XmlSchemaSet.

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Verifica che un oggetto XDocument sia conforme a un XSD in un XmlSchemaSetoggetto , se necessario popolamento dell'albero XML con l'infoset di post-schema-convalida (PSVI).

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Questo metodo convalida che un XElement sottoalbero sia conforme a un oggetto specificato XmlSchemaObject e a un oggetto XmlSchemaSet.

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

Convalida che un oggetto XAttribute sia conforme a un oggetto specificato XmlSchemaObject e a XmlSchemaSet, popolando facoltativamente l'albero XML con l'infoset di post-schema-convalida (PSVI).

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

Verifica che un XElement sottoalbero sia conforme a un oggetto specificato XmlSchemaObject e a , XmlSchemaSetpopolando facoltativamente l'albero XML con l'infoset di convalida post-schema (PSVI).

Commenti

Questi metodi usano un oggetto sottostante XmlReader per convalidare l'albero XML rispetto a un XSD.

I messaggi di errore di convalida e di avviso vengono gestiti tramite il ValidationEventHandler delegato . Se a questi metodi non viene fornito alcun gestore eventi, gli errori di convalida vengono esposti come XmlSchemaValidationException. Gli avvisi di convalida non generano un'eccezione XmlSchemaValidationException .

Alcuni di questi metodi di estensione consentono facoltativamente il popolamento dell'infoset di post-schema-convalida (PSVI).

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Questo metodo convalida che un oggetto XDocument è conforme a un XSD in un oggetto XmlSchemaSet.

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)

Parametri

source
XDocument

Oggetto XDocument da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

Nell'esempio seguente viene creato un oggetto XmlSchemaSet, quindi vengono convalidati due XDocument oggetti rispetto al set di schemi. Uno dei documenti è valido, l'altro non è .

                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

In questo esempio viene generato l'output seguente:

Validating doc1
doc1 validated

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

Commenti

Questo metodo di estensione convalida che l'oggetto XDocument è conforme al modello di contenuto dello schema in XmlSchemaSet.

Si applica a

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Questo metodo convalida che un oggetto XAttribute è conforme a un oggetto specificato XmlSchemaObject e a un oggetto XmlSchemaSet.

public:
[System::Runtime::CompilerServices::Extension]
 static void Validate(System::Xml::Linq::XAttribute ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XAttribute * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XAttribute, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)

Parametri

source
XAttribute

Oggetto XAttribute da convalidare.

partialValidationType
XmlSchemaObject

Oggetto XmlSchemaObject che specifica l'albero secondario da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

                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

In questo esempio viene generato l'output seguente:

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

Commenti

È possibile utilizzare questo metodo per verificare che un oggetto XAttribute sia conforme a uno schema. Questo metodo viene in genere usato quando è stato modificato un attributo e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare solo l'attributo.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione in caso di errori di convalida. Gli avvisi di convalida non genereranno un'eccezione.

Per convalidare un attributo, usare un'istanza di XmlSchemaObject. È possibile ottenere questa istanza in diversi modi. Un modo semplice è il seguente:

  1. Verificare che un documento sia conforme a uno schema.

  2. Aggiungere l'infoset post-schema-validation (PSVI) chiamando il Validate metodo di estensione.

  3. Chiamare il GetSchemaInfo metodo di estensione per recuperare un oggetto che implementa IXmlSchemaInfo. Dall'oggetto recuperato è possibile ottenere un oggetto XmlSchemaObject.

Dopo aver creato un'istanza di , XmlSchemaObjectè possibile usare questo metodo per convalidare un attributo.

Si applica a

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Verifica che un oggetto XDocument sia conforme a un XSD in un XmlSchemaSetoggetto , se necessario popolamento dell'albero XML con l'infoset di post-schema-convalida (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)

Parametri

source
XDocument

Oggetto XDocument da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

addSchemaInfo
Boolean

Oggetto Boolean che indica se popolare l'infoset post-schema-validation (PSVI).

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

L'esempio seguente contiene un XSD che definisce l'elemento Child2 con un Att1 attributo con un valore predefinito. Dopo aver convalidato correttamente il documento, l'attributo con il valore predefinito viene aggiunto all'albero XML. Si noti che l'attributo predefinito non viene aggiunto a doc2, che non viene convalidato rispetto allo schema.

                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

In questo esempio viene generato l'output seguente:

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>

L'esempio seguente popola l'albero con PSVI. Dopo la convalida, stampa tutti gli elementi e gli attributi nell'albero non validi in base a 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

In questo esempio viene generato l'output seguente:

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

Commenti

Questo metodo di estensione convalida che l'oggetto XDocument è conforme al modello di contenuto dello schema in XmlSchemaSet.

Se addSchemaInfo è true, questo metodo popola l'albero XML con l'infoset di convalida post-schema (PSVI).

Esistono due passaggi per popolare l'albero XML con PSVI.

  1. Prima di tutto, viene aggiunta un'annotazione a tutti i nodi dell'albero per consentire di chiamare Extensions.GetSchemaInfo o Extensions.GetSchemaInfo su un elemento o un attributo nell'albero.

  2. In secondo luogo, gli elementi e gli attributi predefiniti definiti nell'XSD vengono aggiunti all'albero XML. Chiamando uno dei GetSchemaInfo metodi, è possibile determinare se un elemento o un attributo specifico è stato aggiunto da XSD come elemento o attributo predefinito.

Si applica a

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Questo metodo convalida che un XElement sottoalbero sia conforme a un oggetto specificato XmlSchemaObject e a un oggetto XmlSchemaSet.

public:
[System::Runtime::CompilerServices::Extension]
 static void Validate(System::Xml::Linq::XElement ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XElement * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XElement, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)

Parametri

source
XElement

Oggetto XElement da convalidare.

partialValidationType
XmlSchemaObject

Oggetto XmlSchemaObject che specifica l'albero secondario da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

                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

In questo esempio viene generato l'output seguente:

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

Commenti

È possibile usare questo metodo per verificare che un sottoalbero (con un oggetto XElement nella radice) sia conforme a uno schema. Questo metodo viene in genere usato quando è stato modificato un sottoalbero e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare solo un sottoalbero.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione in caso di errori di convalida. Gli avvisi di convalida non genereranno un'eccezione.

Per convalidare un sottoalbero, usare un'istanza di XmlSchemaObject. È possibile ottenere questa istanza in diversi modi. Un modo semplice è il seguente:

  1. Verificare che un documento sia conforme a uno schema.

  2. Aggiungere l'infoset post-schema-validation (PSVI) chiamando il Validate metodo di estensione.

  3. Chiamare il GetSchemaInfo metodo di estensione per recuperare un oggetto che implementa IXmlSchemaInfo. Dall'oggetto recuperato è possibile ottenere un oggetto XmlSchemaObject.

Dopo aver creato un'istanza di , XmlSchemaObjectè possibile usare questo metodo per convalidare un sottoalbero.

Si applica a

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

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Convalida che un oggetto XAttribute sia conforme a un oggetto specificato XmlSchemaObject e a XmlSchemaSet, popolando facoltativamente l'albero XML con l'infoset di post-schema-convalida (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)

Parametri

source
XAttribute

Oggetto XAttribute da convalidare.

partialValidationType
XmlSchemaObject

Oggetto XmlSchemaObject che specifica l'albero secondario da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

addSchemaInfo
Boolean

Oggetto Boolean che indica se popolare l'infoset post-schema-validation (PSVI).

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

                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

In questo esempio viene generato l'output seguente:

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

Commenti

È possibile utilizzare questo metodo per verificare che un oggetto XAttribute sia conforme a uno schema. Questo metodo viene in genere usato quando è stato modificato un attributo e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare solo l'attributo.

Se addSchemaInfo è true, questo metodo popola l'attributo con l'infoset post-schema-validation (PSVI). Dopo aver popolato l'albero XML con PSVI, è possibile chiamare Extensions.GetSchemaInfo sull'attributo convalidato. Ciò è utile se si scrive codice che si basa sui dati restituiti da GetSchemaInfo.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione in caso di errori di convalida. Gli avvisi di convalida non genereranno un'eccezione.

Per convalidare un attributo, usare un'istanza di XmlSchemaObject. È possibile ottenere questa istanza in diversi modi. Un modo semplice è il seguente:

  1. Verificare che un documento sia conforme a uno schema.

  2. Aggiungere l'infoset post-schema-validation (PSVI) chiamando il Validate metodo di estensione.

  3. Chiamare il GetSchemaInfo metodo di estensione per recuperare un oggetto che implementa IXmlSchemaInfo. Dall'oggetto recuperato è possibile ottenere un oggetto XmlSchemaObject.

Dopo aver creato un'istanza di , XmlSchemaObjectè possibile usare questo metodo per convalidare un attributo.

Si applica a

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

Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs
Origine:
XNodeValidator.cs

Verifica che un XElement sottoalbero sia conforme a un oggetto specificato XmlSchemaObject e a , XmlSchemaSetpopolando facoltativamente l'albero XML con l'infoset di convalida post-schema (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)

Parametri

source
XElement

Oggetto XElement da convalidare.

partialValidationType
XmlSchemaObject

Oggetto XmlSchemaObject che specifica l'albero secondario da convalidare.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet su cui eseguire la convalida.

validationEventHandler
ValidationEventHandler

Oggetto ValidationEventHandler per un evento che si verifica quando il lettore rileva errori di convalida. Se null, genera un'eccezione in caso di errori di convalida.

addSchemaInfo
Boolean

Oggetto Boolean che indica se popolare l'infoset post-schema-validation (PSVI).

Eccezioni

Generata per gli errori di convalida XSD (XML Schema Definition Language).

Esempio

                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

In questo esempio viene generato l'output seguente:

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>

Commenti

È possibile usare questo metodo per verificare che un sottoalbero (con una XElement nella radice della sottoalbero) sia conforme a uno schema. Questo metodo viene in genere usato quando è stato modificato un sottoalbero e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare solo un sottoalbero.

Se addSchemaInfo è true, questo metodo popola l'albero XML con l'infoset di post-schema-convalida (PSVI).

Esistono due aspetti del popolamento dell'albero XML con PSVI.

Prima di tutto, viene aggiunta un'annotazione a tutti i nodi dell'albero in modo che sia ora possibile chiamare GetSchemaInfo su un elemento o un attributo nell'albero.

In secondo luogo, gli elementi e gli attributi predefiniti definiti nell'XSD vengono aggiunti all'albero XML. Chiamando uno dei GetSchemaInfo metodi, è possibile determinare se un elemento o un attributo specifico è stato aggiunto da XSD come elemento o attributo predefinito.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione in caso di errori di convalida. Gli avvisi di convalida non genereranno un'eccezione.

Per convalidare un sottoalbero, usare un'istanza di XmlSchemaObject. È possibile ottenere questa istanza in diversi modi. Un modo semplice è il seguente:

  1. Verificare che un documento sia conforme a uno schema.

  2. Aggiungere l'infoset post-schema-validation (PSVI) chiamando il Validate metodo di estensione.

  3. Chiamare il GetSchemaInfo metodo di estensione per recuperare un oggetto che implementa IXmlSchemaInfo. Dall'oggetto recuperato è possibile ottenere un oggetto XmlSchemaObject.

Dopo aver creato un'istanza di , XmlSchemaObjectè possibile usare questo metodo per convalidare un sottoalbero.

Si applica a