Extensions.Validate Metodo

Definizione

Convalida che un XDocument, un XElement o un XAttribute è conforme a uno schema XSD in un XmlSchemaSet.

Overload

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

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

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

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

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Convalida che un XDocument è conforme a uno schema XSD in un XmlSchemaSet, popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello schema (PSVI).

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Questo metodo convalida che una sottostruttura XElement è conforme a un XmlSchemaObject e a un XmlSchemaSet.

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

Convalida che un XAttribute è conforme a un XmlSchemaObject specificato e a un XmlSchemaSet popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello schema (PSVI).

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

Convalida che una sottostruttura XElement è conforme a un XmlSchemaObject specificato e a un XmlSchemaSet popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello 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 avviso vengono gestiti usando il ValidationEventHandler delegato. Se non viene fornito alcun gestore eventi a questi metodi, gli errori di convalida vengono esposti come XmlSchemaValidationException. Gli avvisi di convalida non causano l'generata di un oggetto XmlSchemaValidationException .

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

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

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

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

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

Parametri

source
XDocument

Oggetto XDocument da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

Eccezioni

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

Esempio

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

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

Nell'esempio viene prodotto 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

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

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

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

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

Parametri

source
XAttribute

Oggetto XAttribute da convalidare.

partialValidationType
XmlSchemaObject

XmlSchemaObject che specifica la sottostruttura da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

Eccezioni

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

Nell'esempio viene prodotto 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 usare questo metodo per verificare che un oggetto XAttribute sia conforme a uno schema. In genere si usa questo metodo quando si è 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 dopo gli errori di convalida. Gli avvisi di convalida non generano un'eccezione.

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

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

  2. Aggiungere il post-schema-validation infoset (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 XmlSchemaObjectoggetto .

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

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

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

Convalida che un XDocument è conforme a uno schema XSD in un XmlSchemaSet, popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello schema (PSVI).

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

Parametri

source
XDocument

Oggetto XDocument da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

addSchemaInfo
Boolean

Boolean che indica se popolare l'infoset dopo la convalida dello schema (PSVI).

Eccezioni

Eccezione 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 attributo con un Att1 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);  

Nell'esempio viene prodotto 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>  

Nell'esempio seguente viene popolato l'albero con PSVI. Dopo la convalida, stampa tutti gli elementi e gli attributi nell'albero non validi in base alla 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);  
}  

Nell'esempio viene prodotto 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 in un elemento o attributo nell'albero.

  2. In secondo luogo, gli elementi e gli attributi predefiniti definiti in 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

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

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

Questo metodo convalida che una sottostruttura XElement è conforme a un XmlSchemaObject e a un XmlSchemaSet.

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

Parametri

source
XElement

Oggetto XElement da convalidare.

partialValidationType
XmlSchemaObject

XmlSchemaObject che specifica la sottostruttura da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

Eccezioni

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

Nell'esempio viene prodotto 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 sotto-albero (con un elemento XElement nella radice) sia conforme a uno schema. In genere si usa questo metodo quando si è modificato un sotto-albero e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare un solo sotto-albero.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione dopo gli errori di convalida. Gli avvisi di convalida non generano un'eccezione.

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

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

  2. Aggiungere il post-schema-validation infoset (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 XmlSchemaObjectoggetto .

Dopo avere un'istanza di , XmlSchemaObjectè possibile usare questo metodo per convalidare un sotto-albero.

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

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

Convalida che un XAttribute è conforme a un XmlSchemaObject specificato e a un XmlSchemaSet popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello schema (PSVI).

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

Parametri

source
XAttribute

Oggetto XAttribute da convalidare.

partialValidationType
XmlSchemaObject

XmlSchemaObject che specifica la sottostruttura da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

addSchemaInfo
Boolean

Boolean che indica se popolare l'infoset dopo la convalida dello schema (PSVI).

Eccezioni

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

Nell'esempio viene prodotto 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 usare questo metodo per verificare che un oggetto XAttribute sia conforme a uno schema. In genere si usa questo metodo quando si è 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 di convalida post-schema (PSVI). Dopo aver popolato l'albero XML con PSVI, è possibile chiamare Extensions.GetSchemaInfo l'attributo convalidato. Questo è utile se si scrive codice che si basa sui dati restituiti da GetSchemaInfo.

Se si passa null per validationEventHandler, questo metodo genera un'eccezione dopo gli errori di convalida. Gli avvisi di convalida non generano un'eccezione.

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

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

  2. Aggiungere il post-schema-validation infoset (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 XmlSchemaObjectoggetto .

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

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

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

Convalida che una sottostruttura XElement è conforme a un XmlSchemaObject specificato e a un XmlSchemaSet popolando facoltativamente la struttura ad albero XML con l'infoset dopo la convalida dello schema (PSVI).

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

Parametri

source
XElement

Oggetto XElement da convalidare.

partialValidationType
XmlSchemaObject

XmlSchemaObject che specifica la sottostruttura da convalidare.

schemas
XmlSchemaSet

XmlSchemaSet rispetto al quale convalidare.

validationEventHandler
ValidationEventHandler

ValidationEventHandler per un evento che si verifica quando il visualizzatore incontra errori di convalida. Se null, genera un'eccezione in base agli errori di convalida.

addSchemaInfo
Boolean

Boolean che indica se popolare l'infoset dopo la convalida dello schema (PSVI).

Eccezioni

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

Nell'esempio viene prodotto 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 sotto-albero (con una XElement alla radice dell'albero secondario) sia conforme a uno schema. In genere si usa questo metodo quando si è modificato un sotto-albero e si vuole assicurarsi che sia ancora conforme al relativo schema. È possibile convalidare l'intero documento, ma richiede meno tempo di elaborazione per convalidare un solo sotto-albero.

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

Esistono due aspetti della 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 in 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 dopo gli errori di convalida. Gli avvisi di convalida non generano un'eccezione.

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

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

  2. Aggiungere il post-schema-validation infoset (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 XmlSchemaObjectoggetto .

Dopo avere ottenuto un'istanza di XmlSchemaObject, è possibile usare questo metodo per convalidare un sotto-albero.

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1