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 (XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

 

Data di pubblicazione: ottobre 2016

Verifica che un XAttribute conforme a un XmlSchemaObject e 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 XAttribute source,
	XmlSchemaObject partialValidationType,
	XmlSchemaSet schemas,
	ValidationEventHandler validationEventHandler,
	bool addSchemaInfo
)

Parametri

source
Type: System.Xml.Linq.XAttribute

Oggetto XAttribute da convalidare.

partialValidationType
Type: System.Xml.Schema.XmlSchemaObject

Un XmlSchemaObject che specifica la sottostruttura 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).

È possibile utilizzare questo metodo per convalidare che un XAttribute conforme a uno schema. In genere possibile utilizzare questo metodo quando è stato modificato un attributo e si desidera 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 la post-schema-validation infoset (PSVI). Dopo avere popolato la struttura ad 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 base agli errori di convalida. Avvisi di convalida non genererà un'eccezione.

Per convalidare un attributo, utilizzare un'istanza di XmlSchemaObject. È possibile ottenere questa istanza in vari modi. Un modo semplice consiste nel modo seguente:

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

  2. Aggiungere la 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 XmlSchemaObject.

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


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

Questo esempio produce il seguente output:

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

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