Condividi tramite


XmlSchemaInference.InferSchema Metodo

Definizione

Deduce uno schema XSD (XML Schema Definition Language) dal documento XML specificato.

Overload

InferSchema(XmlReader)

Deriva uno schema XSD (XML Schema Definition Language) dal documento XML contenuto nell'oggetto XmlReader specificato.

InferSchema(XmlReader, XmlSchemaSet)

Deriva uno schema XSD (XML Schema Definition Language) dal documento XML contenuto nell'oggetto XmlReader specificato e definisce in modo più preciso lo schema derivato utilizzando uno schema esistente nell'oggetto XmlSchemaSet specificato con lo stesso spazio dei nomi di destinazione.

InferSchema(XmlReader)

Deriva uno schema XSD (XML Schema Definition Language) dal documento XML contenuto nell'oggetto XmlReader specificato.

public:
 System::Xml::Schema::XmlSchemaSet ^ InferSchema(System::Xml::XmlReader ^ instanceDocument);
public System.Xml.Schema.XmlSchemaSet InferSchema (System.Xml.XmlReader instanceDocument);
member this.InferSchema : System.Xml.XmlReader -> System.Xml.Schema.XmlSchemaSet
Public Function InferSchema (instanceDocument As XmlReader) As XmlSchemaSet

Parametri

instanceDocument
XmlReader

Oggetto XmlReader contenente il documento XML da cui derivare uno schema.

Restituisce

XmlSchemaSet

Oggetto XmlSchemaSet contenente gli schemi derivati.

Eccezioni

Il formato del documento XML non è corretto.

L'oggetto XmlReader non è posizionato in corrispondenza del nodo radice o di un elemento. Si verifica un errore durante il processo di derivazione dello schema.

Esempio

Questo esempio accetta un file XML come input e genera uno schema in grado di convalidare il codice XML di esempio.

XmlReader^ reader = XmlReader::Create("contosoBooks.xml");
XmlSchemaSet^ schemaSet = gcnew XmlSchemaSet();
XmlSchemaInference^ schema = gcnew XmlSchemaInference();

schemaSet = schema->InferSchema(reader);

for each (XmlSchema^ s in schemaSet->Schemas())
{
    s->Write(Console::Out);
}
XmlReader reader = XmlReader.Create("contosoBooks.xml");
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference schema = new XmlSchemaInference();

schemaSet = schema.InferSchema(reader);

foreach (XmlSchema s in schemaSet.Schemas())
{
    s.Write(Console.Out);
}
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml")
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim schema As XmlSchemaInference = New XmlSchemaInference()

schemaSet = schema.InferSchema(reader)

For Each s As XmlSchema In schemaSet.Schemas()
    s.Write(Console.Out)
Next

Di seguito è riportato il file XML di input.

<bookstore xmlns="http://www.contoso.com/books">
  <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

Di seguito è riportato lo schema dedotto dal documento XML.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Commenti

Il InferSchema metodo deduce uno o più schemi XSD (XML Schema Definition Language) W3C dal documento dell'istanza XML contenuto nell'oggetto XmlReader specificato. Se il documento XML contiene elementi e attributi di più spazi dei nomi, vengono generati più schemi: uno per ogni spazio dei nomi usato nel documento. Lo schema primario è lo schema in grado di convalidare l'intero documento XML e lo spazio dei nomi di destinazione corrisponde allo spazio dei nomi dell'elemento documento del documento XML.

Di seguito sono riportate note importanti da considerare quando si usa il InferSchema metodo .

  • Il InferSchema metodo ignora tutti xsi:typegli attributi , xsi:schemaLocationo xsi:noNamespaceSchemaLocation nel documento XML.

  • Se l'oggetto XmlReader è tipizzato, le informazioni sul tipo contenute vengono ignorate.

  • Se l'oggetto XmlReader è posizionato su un elemento che non è l'elemento radice del documento XML, viene dedotto uno schema solo per tale elemento. Se l'oggetto XmlReader non è posizionato su un elemento, il Read metodo viene chiamato sul XmlReader parametro fino a quando non viene rilevato un elemento (ad esempio, quando NodeType è Element). A questo punto, il processo di inferenza inizia da tale elemento. Se non viene rilevato alcun elemento fino alla fine del documento, viene generata un'eccezione ArgumentException .

Si applica a

InferSchema(XmlReader, XmlSchemaSet)

Deriva uno schema XSD (XML Schema Definition Language) dal documento XML contenuto nell'oggetto XmlReader specificato e definisce in modo più preciso lo schema derivato utilizzando uno schema esistente nell'oggetto XmlSchemaSet specificato con lo stesso spazio dei nomi di destinazione.

public:
 System::Xml::Schema::XmlSchemaSet ^ InferSchema(System::Xml::XmlReader ^ instanceDocument, System::Xml::Schema::XmlSchemaSet ^ schemas);
public System.Xml.Schema.XmlSchemaSet InferSchema (System.Xml.XmlReader instanceDocument, System.Xml.Schema.XmlSchemaSet schemas);
member this.InferSchema : System.Xml.XmlReader * System.Xml.Schema.XmlSchemaSet -> System.Xml.Schema.XmlSchemaSet
Public Function InferSchema (instanceDocument As XmlReader, schemas As XmlSchemaSet) As XmlSchemaSet

Parametri

instanceDocument
XmlReader

Oggetto XmlReader contenente il documento XML da cui derivare uno schema.

schemas
XmlSchemaSet

Oggetto XmlSchemaSet contenente uno schema esistente utilizzato per definire in modo più preciso lo schema derivato.

Restituisce

XmlSchemaSet

Oggetto XmlSchemaSet contenente gli schemi derivati.

Eccezioni

Il formato del documento XML non è corretto.

L'oggetto XmlReader non è posizionato in corrispondenza del nodo radice o di un elemento. Si verifica un errore durante il processo di derivazione dello schema.

Esempio

Il codice di esempio seguente accetta il documento XML 1 come input e genera uno schema in grado di convalidare il documento XML 1. Il codice di esempio accetta quindi il documento XML 2 e affina lo schema generato dal documento XML 1, in base alle modifiche trovate nel documento XML 2.

Di seguito è riportato il documento XML 1.

<?xml version="1.0" encoding="utf-8"?>
<item xmlns="http://www.contoso.com/items" productID="123456789">
    <name>Hammer</name>
    <price>9.95</price>
    <supplierID>1929</supplierID>
</item>

Di seguito è riportato il documento XML 2.

<?xml version="1.0" encoding="utf-8"?>
<item xmlns="http://www.contoso.com/items" productID="A53-246">
    <name>Paint</name>
    <price>12.50</price>
</item>

Il codice di esempio seguente deduce uno schema dal primo documento XML contenuto in readere quindi affina lo schema dedotto con le modifiche trovate nel secondo documento XML contenuto in reader1. Il codice di esempio usa il primo metodo di InferSchema overload per dedurre lo schema e il secondo metodo di InferSchema overload per perfezionare lo schema esistente nell'oggetto XmlSchemaSet .

XmlReader^ reader = XmlReader::Create("item1.xml");
XmlReader^ reader1 = XmlReader::Create("item2.xml");
XmlSchemaSet^ schemaSet = gcnew XmlSchemaSet();
XmlSchemaInference^ inference = gcnew XmlSchemaInference();
schemaSet = inference->InferSchema(reader);

// Display the inferred schema.
Console::WriteLine("Original schema:\n");
for each (XmlSchema^ schema in schemaSet->Schemas("http://www.contoso.com/items"))
{
    schema->Write(Console::Out);
}

// Use the additional data in item2.xml to refine the original schema.
schemaSet = inference->InferSchema(reader1, schemaSet);

// Display the refined schema.
Console::WriteLine("\n\nRefined schema:\n");
for each (XmlSchema^ schema in schemaSet->Schemas("http://www.contoso.com/items"))
{
    schema->Write(Console::Out);
}
XmlReader reader = XmlReader.Create("item1.xml");
XmlReader reader1 = XmlReader.Create("item2.xml");
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference inference = new XmlSchemaInference();
schemaSet = inference.InferSchema(reader);

// Display the inferred schema.
Console.WriteLine("Original schema:\n");
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/items"))
{
    schema.Write(Console.Out);
}

// Use the additional data in item2.xml to refine the original schema.
schemaSet = inference.InferSchema(reader1, schemaSet);

// Display the refined schema.
Console.WriteLine("\n\nRefined schema:\n");
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/items"))
{
    schema.Write(Console.Out);
}
Dim reader As XmlReader = XmlReader.Create("item1.xml")
Dim reader1 As XmlReader = XmlReader.Create("item2.xml")
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim inference As XmlSchemaInference = New XmlSchemaInference()
schemaSet = inference.InferSchema(reader)

' Display the inferred schema.
Console.WriteLine("Original schema:\n")
For Each schema As XmlSchema In schemaSet.Schemas("http://www.contoso.com/items")
    schema.Write(Console.Out)
Next

' Use the additional data in item2.xml to refine the original schema.
schemaSet = inference.InferSchema(reader1, schemaSet)

' Display the refined schema.
Console.WriteLine("\n\nRefined schema:\n")
For Each schema As XmlSchema In schemaSet.Schemas("http://www.contoso.com/items")
    schema.Write(Console.Out)
Next

Lo schema seguente è lo schema dedotto dal documento XML 1.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/items" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="price" type="xs:decimal" />
        <xs:element name="supplierID" type="xs:unsignedShort" />
      </xs:sequence>
      <xs:attribute name="productID" type="xs:unsignedInt" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>

Lo schema seguente è la versione perfezionata dello schema precedente, in base al documento XML 2.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/items" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="price" type="xs:decimal" />
        <xs:element minOccurs="0" name="supplierID" type="xs:unsignedShort" />
      </xs:sequence>
      <xs:attribute name="productID" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>

Commenti

Il InferSchema metodo deduce uno o più schemi XSD (XML Schema Definition Language) W3C dal documento dell'istanza XML contenuto nell'oggetto XmlReader specificato. Se il documento XML contiene elementi e attributi di più spazi dei nomi, vengono generati più schemi: uno per ogni spazio dei nomi usato nel documento. Lo schema primario è lo schema in grado di convalidare l'intero documento XML e lo spazio dei nomi di destinazione corrisponde allo spazio dei nomi dell'elemento documento del documento XML.

Di seguito sono riportate note importanti da considerare quando si usa il InferSchema metodo .

  • Il InferSchema metodo ignora tutti xsi:typegli attributi , xsi:schemaLocationo xsi:noNamespaceSchemaLocation nel documento XML.

  • Se l'oggetto XmlReader è tipizzato, le informazioni sul tipo contenute vengono ignorate.

  • Se l'oggetto XmlReader è posizionato su un elemento che non è l'elemento radice del documento XML, viene dedotto uno schema solo per tale elemento. Se l'oggetto XmlReader non è posizionato su un elemento, il Read metodo viene chiamato sul XmlReader parametro fino a quando non viene rilevato un elemento (ad esempio, quando NodeType è Element). A questo punto, il processo di inferenza inizia da tale elemento. Se non viene rilevato alcun elemento fino alla fine del documento, viene generata un'eccezione ArgumentException .

  • Se un XmlSchemaSet oggetto viene passato come parametro e l'elemento su cui è posizionato l'oggetto XmlReader viene definito in uno degli schemi in XmlSchemaSet, lo schema dedotto viene usato per perfezionare uno schema esistente nel XmlSchemaSet parametro con lo stesso spazio dei nomi di destinazione; in caso contrario, viene dedotto un nuovo schema per lo spazio dei nomi.

Si applica a