Sdílet prostřednictvím


XmlSchemaInference.InferSchema Metoda

Definice

Odvozuje schéma XSD (XML Schema Definition Language) ze zadaného dokumentu XML.

Přetížení

InferSchema(XmlReader)

Odvozuje schéma XSD (XML Schema Definition Language) z dokumentu XML obsaženého v zadaném objektu XmlReader .

InferSchema(XmlReader, XmlSchemaSet)

Odvozuje schéma XSD (XML Schema Definition Language) z dokumentu XML obsaženého XmlReader v zadaném objektu a upřesňuje odvozené schéma pomocí existujícího schématu v objektu XmlSchemaSet určeném se stejným cílovým oborem názvů.

InferSchema(XmlReader)

Odvozuje schéma XSD (XML Schema Definition Language) z dokumentu XML obsaženého v zadaném objektu XmlReader .

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

Parametry

instanceDocument
XmlReader

Objekt XmlReader obsahující dokument XML k odvození schématu.

Návraty

XmlSchemaSet

Objekt XmlSchemaSet obsahující odvozená schémata.

Výjimky

Dokument XML není správně vytvořen.

Objekt XmlReader není umístěn na kořenovém uzlu ani na elementu. Během procesu odvození schématu dojde k chybě.

Příklady

Tento příklad vezme soubor XML jako vstup a vygeneruje schéma, které může ověřit příklad XML.

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

Následuje vstupní soubor XML.

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

Následuje schéma odvozené z dokumentu 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>

Poznámky

Metoda InferSchema odvozuje jedno nebo více schémat W3C XML Schema Definition Language (XSD) z dokumentu instance XML obsaženého v zadaném objektu XmlReader . Pokud dokument XML obsahuje prvky a atributy z více oborů názvů, vygenerují se více schémat: jedno pro každý obor názvů použitý v dokumentu. Primární schéma je schéma, které může ověřit celý dokument XML a jeho cílový obor názvů je stejný jako obor názvů elementu dokumentu XML.

Při používání InferSchema metody je potřeba vzít v úvahu následující důležité poznámky.

  • Metoda InferSchema ignoruje všechny xsi:type, nebo xsi:schemaLocation``xsi:noNamespaceSchemaLocation atributy v dokumentu XML.

  • XmlReader Pokud je objekt zadán, informace o typu, které obsahuje, se ignorují.

  • XmlReader Pokud je objekt umístěn na elementu, který není kořenovým prvkem dokumentu XML, schéma je odvozeno pouze pro tento prvek. Pokud objekt XmlReader není umístěn na prvku, metoda je volána na XmlReader parametr, Read dokud není nalezen prvek (například když NodeType je Element). V tomto okamžiku proces odvození začíná z tohoto prvku. Pokud se do konce dokumentu nenarazí žádný prvek, vyvolá se příkaz.ArgumentException

Platí pro

InferSchema(XmlReader, XmlSchemaSet)

Odvozuje schéma XSD (XML Schema Definition Language) z dokumentu XML obsaženého XmlReader v zadaném objektu a upřesňuje odvozené schéma pomocí existujícího schématu v objektu XmlSchemaSet určeném se stejným cílovým oborem názvů.

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

Parametry

instanceDocument
XmlReader

Objekt XmlReader obsahující dokument XML k odvození schématu.

schemas
XmlSchemaSet

Objekt XmlSchemaSet obsahující existující schéma sloužící k upřesnění odvozeného schématu.

Návraty

XmlSchemaSet

Objekt XmlSchemaSet obsahující odvozená schémata.

Výjimky

Dokument XML není správně vytvořen.

Objekt XmlReader není umístěn na kořenovém uzlu ani na elementu. Během procesu odvození schématu dojde k chybě.

Příklady

Následující ukázkový kód přebírá jako vstup dokument XML 1 a vygeneruje schéma, které může ověřit dokument XML 1. Ukázkový kód pak vezme dokument XML 2 a zpřesní schéma generované z dokumentu XML 1 na základě změn nalezených v dokumentu XML 2.

Následuje dokument 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>

Následuje dokument 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>

Následující příklad kódu odvozuje schéma z prvního dokumentu XML obsaženého v reader, a pak upřesňuje odvozené schéma se změnami nalezenými v druhém dokumentu XML obsaženém v reader1. Ukázkový kód používá první přetíženou InferSchema metodu k odvození schématu a druhou přetíženou InferSchema metodu k upřesnění existujícího schématu v objektu 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

Následující schéma je schéma odvozené z dokumentu 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>

Následující schéma je upřesněná verze výše uvedeného schématu na základě dokumentu 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>

Poznámky

Metoda InferSchema odvozuje jedno nebo více schémat W3C XML Schema Definition Language (XSD) z dokumentu instance XML obsaženého v zadaném objektu XmlReader . Pokud dokument XML obsahuje prvky a atributy z více oborů názvů, vygenerují se více schémat: jedno pro každý obor názvů použitý v dokumentu. Primární schéma je schéma, které může ověřit celý dokument XML a jeho cílový obor názvů je stejný jako obor názvů elementu dokumentu XML.

Při používání InferSchema metody je potřeba vzít v úvahu následující důležité poznámky.

  • Metoda InferSchema ignoruje všechny xsi:type, nebo xsi:schemaLocation``xsi:noNamespaceSchemaLocation atributy v dokumentu XML.

  • XmlReader Pokud je objekt zadán, informace o typu, které obsahuje, se ignorují.

  • XmlReader Pokud je objekt umístěn na elementu, který není kořenovým prvkem dokumentu XML, schéma je odvozeno pouze pro tento prvek. Pokud objekt XmlReader není umístěn na prvku, metoda je volána na XmlReader parametr, Read dokud není nalezen prvek (například když NodeType je Element). V tomto okamžiku proces odvození začíná z tohoto prvku. Pokud se do konce dokumentu nenarazí žádný prvek, vyvolá se příkaz.ArgumentException

  • XmlSchemaSet Pokud se objekt předá jako parametr a prvek, na kterém XmlReader je objekt umístěn, je definován v jednom ze schémat v objektu XmlSchemaSet, odvozené schéma se použije k upřesnění existujícího schématu v parametru XmlSchemaSet se stejným cílovým oborem názvů, jinak je pro obor názvů odvozeno nové schéma.

Platí pro