Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Extensions.Validate (XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

 

Data di pubblicazione: ottobre 2016

Verifica che un XDocument è conforme a uno schema XSD in un XmlSchemaSet, eventualmente popolando la struttura ad albero XML con le informazioni sulla convalida post-schema (PSVI).

Spazio dei nomi:   System.Xml.Schema
Assembly:  System.Xml.Linq (in System.Xml.Linq.dll)

public static void Validate(
	this XDocument source,
	XmlSchemaSet schemas,
	ValidationEventHandler validationEventHandler,
	bool addSchemaInfo
)

Parametri

source
Type: System.Xml.Linq.XDocument

Oggetto XDocument da convalidare.

schemas
Type: System.Xml.Schema.XmlSchemaSet

Un XmlSchemaSet per la convalida.

validationEventHandler
Type: System.Xml.Schema.ValidationEventHandler

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

addSchemaInfo
Type: System.Boolean

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

Exception Condition
XmlSchemaValidationException

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

Questo metodo di estensione convalida che il XDocument conforme al modello di contenuto dello schema in XmlSchemaSet.

Se addSchemaInfo è true, questo metodo consente di popolare l'albero XML con la post-schema-validation infoset (PSVI).

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

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

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

Nell'esempio seguente contiene uno schema XSD che definisce il Child2 elemento con un Att1 attributo con un valore predefinito. Dopo aver completato la convalida del documento, l'attributo con il valore predefinito viene aggiunto all'albero XML. Si noti che l'attributo predefinito non è aggiunto a doc2, che non convalida 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);

Questo esempio produce il seguente output:

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 consente di popolare l'albero con PSVI. Dopo la convalida, vengono stampati tutti gli elementi e attributi nell'albero che non sono validi in base a un valore 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);
}

Questo esempio produce il seguente output:

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

.NET Framework
Disponibile da 3.5
Torna all'inizio
Mostra: