Udostępnij za pośrednictwem


XmlSchemaInference.InferSchema Metoda

Definicja

Wywnioskuje schemat języka definicji schematu XML (XSD) z określonego dokumentu XML.

Przeciążenia

InferSchema(XmlReader)

Wywnioskuje schemat języka definicji schematu XML (XSD) z dokumentu XML zawartego XmlReader w określonym obiekcie.

InferSchema(XmlReader, XmlSchemaSet)

Wywnioskuje schemat języka definicji schematu XML (XSD) z dokumentu XML zawartego w XmlReader określonym obiekcie i uściśli schemat wnioskowany przy użyciu istniejącego schematu w XmlSchemaSet obiekcie określonym z tą samą docelową przestrzenią nazw.

InferSchema(XmlReader)

Wywnioskuje schemat języka definicji schematu XML (XSD) z dokumentu XML zawartego XmlReader w określonym obiekcie.

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

XmlReader Obiekt zawierający dokument XML do wnioskowania schematu.

Zwraca

XmlSchemaSet

XmlSchemaSet Obiekt zawierający wnioskowane schematy.

Wyjątki

Dokument XML nie jest dobrze sformułowany.

XmlReader Obiekt nie jest umieszczony w węźle głównym ani w elemecie. Podczas procesu wnioskowania schematu występuje błąd.

Przykłady

W tym przykładzie plik XML jest pobierany jako dane wejściowe i generuje schemat, który może zweryfikować przykładowy kod 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

Poniżej znajduje się wejściowy plik 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>

Poniżej przedstawiono schemat wnioskowany 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>

Uwagi

Metoda InferSchema wywnioskuje jeden lub więcej schematów języka definicji schematu XML W3C (XSD) z dokumentu wystąpienia XML zawartego XmlReader w określonym obiekcie. Jeśli dokument XML zawiera elementy i atrybuty z wielu przestrzeni nazw, generowanych jest wiele schematów: jeden dla każdej przestrzeni nazw używanej w dokumencie. Schemat podstawowy to schemat, który może zweryfikować cały dokument XML, a jego docelowa przestrzeń nazw jest taka sama jak przestrzeń nazw elementu dokumentu XML.

Poniżej przedstawiono ważne uwagi, które należy wziąć pod uwagę podczas korzystania z InferSchema metody .

  • Metoda InferSchema ignoruje wszystkie xsi:typeatrybuty , xsi:schemaLocationlub xsi:noNamespaceSchemaLocation w dokumencie XML.

  • XmlReader Jeśli obiekt jest wpisany, informacje o typie, które zawiera, są ignorowane.

  • XmlReader Jeśli obiekt jest umieszczony na elemecie, który nie jest elementem głównym dokumentu XML, schemat jest wnioskowany tylko dla tego elementu. XmlReader Jeśli obiekt nie jest umieszczony w elemecie, Read metoda jest wywoływana w parametrze XmlReader do momentu napotkania elementu (na przykład gdy NodeType jest Elementto ). W tym momencie proces wnioskowania rozpoczyna się od tego elementu. Jeśli żaden element nie zostanie napotkany do końca dokumentu, ArgumentException zostanie zgłoszony element.

Dotyczy

InferSchema(XmlReader, XmlSchemaSet)

Wywnioskuje schemat języka definicji schematu XML (XSD) z dokumentu XML zawartego w XmlReader określonym obiekcie i uściśli schemat wnioskowany przy użyciu istniejącego schematu w XmlSchemaSet obiekcie określonym z tą samą docelową przestrzenią nazw.

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

XmlReader Obiekt zawierający dokument XML do wnioskowania schematu.

schemas
XmlSchemaSet

XmlSchemaSet Obiekt zawierający istniejący schemat używany do uściślinia wnioskowanego schematu.

Zwraca

XmlSchemaSet

XmlSchemaSet Obiekt zawierający wnioskowane schematy.

Wyjątki

Dokument XML nie jest dobrze sformułowany.

XmlReader Obiekt nie jest umieszczony w węźle głównym ani w elemecie. Podczas procesu wnioskowania schematu występuje błąd.

Przykłady

Poniższy przykładowy kod przyjmuje dokument XML 1 jako dane wejściowe i generuje schemat, który może zweryfikować dokument XML 1. Przykładowy kod pobiera następnie dokument XML 2 i uściśli schemat wygenerowany na podstawie dokumentu XML 1 na podstawie zmian znalezionych w dokumencie XML 2.

Poniżej przedstawiono 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>

Poniżej przedstawiono 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>

Poniższy przykładowy kod wywnioskuje schemat z pierwszego dokumentu XML zawartego w readerpliku , a następnie uściśli schemat wnioskowany ze zmianami znalezionymi w drugim dokumencie XML zawartym w reader1pliku . Przykładowy kod używa pierwszej przeciążonej InferSchema metody do wnioskowania schematu, a druga przeciążona InferSchema metoda uściśliła istniejący schemat w XmlSchemaSet obiekcie.

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

Poniższy schemat jest schematem wywnioskowany 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>

Poniższy schemat to uściśliona wersja powyższego schematu oparta na dokumencie 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>

Uwagi

Metoda InferSchema wywnioskuje jeden lub więcej schematów języka definicji schematu XML W3C (XSD) z dokumentu wystąpienia XML zawartego XmlReader w określonym obiekcie. Jeśli dokument XML zawiera elementy i atrybuty z wielu przestrzeni nazw, generowanych jest wiele schematów: jeden dla każdej przestrzeni nazw używanej w dokumencie. Schemat podstawowy to schemat, który może zweryfikować cały dokument XML, a jego docelowa przestrzeń nazw jest taka sama jak przestrzeń nazw elementu dokumentu XML.

Poniżej przedstawiono ważne uwagi, które należy wziąć pod uwagę podczas korzystania z InferSchema metody .

  • Metoda InferSchema ignoruje wszystkie xsi:typeatrybuty , xsi:schemaLocationlub xsi:noNamespaceSchemaLocation w dokumencie XML.

  • XmlReader Jeśli obiekt jest wpisany, informacje o typie, które zawiera, są ignorowane.

  • XmlReader Jeśli obiekt jest umieszczony na elemecie, który nie jest elementem głównym dokumentu XML, schemat jest wnioskowany tylko dla tego elementu. XmlReader Jeśli obiekt nie jest umieszczony w elemecie, Read metoda jest wywoływana w parametrze XmlReader do momentu napotkania elementu (na przykład gdy NodeType jest Elementto ). W tym momencie proces wnioskowania rozpoczyna się od tego elementu. Jeśli żaden element nie zostanie napotkany do końca dokumentu, ArgumentException zostanie zgłoszony element.

  • XmlSchemaSet Jeśli obiekt jest przekazywany jako parametr i element, na którym XmlReader obiekt jest umieszczony, jest zdefiniowany w jednym ze schematów w XmlSchemaSetobiekcie , wnioskowany schemat jest używany do uściślinia istniejącego schematu w parametrze XmlSchemaSet z tą samą docelową przestrzenią nazw. W przeciwnym razie nowy schemat jest wnioskowany dla przestrzeni nazw.

Dotyczy