XmlSchemaInference.InferSchema Methode

Definition

Leitet ein XSD-Schema (XML Schema Definition) vom angegebenen XML-Dokument ab.

Überlädt

InferSchema(XmlReader)

Leitet ein XSD-Schema (XML Schema Definition) von dem XML-Dokument ab, das im angegebenen XmlReader-Objekt enthalten ist.

InferSchema(XmlReader, XmlSchemaSet)

Leitet ein XSD-Schema (XML Schema Definition) von dem XML-Dokument ab, das im angegebenen XmlReader-Objekt enthalten ist, und passt das abgeleitete Schema mithilfe eines im XmlSchemaSet-Objekt vorhandenen Schemas an, das mit demselben Zielnamespace angegeben ist.

InferSchema(XmlReader)

Leitet ein XSD-Schema (XML Schema Definition) von dem XML-Dokument ab, das im angegebenen XmlReader-Objekt enthalten ist.

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

Parameter

instanceDocument
XmlReader

Ein XmlReader-Objekt, das das XML-Dokument enthält, von dem ein Schema abgeleitet werden soll.

Gibt zurück

XmlSchemaSet

Ein XmlSchemaSet-Objekt, das die abgeleiteten Schemas enthält.

Ausnahmen

Das XML-Dokument ist nicht wohlgeformt.

Das XmlReader-Objekt ist nicht auf dem Stammknoten oder auf einem Element positioniert. Während des Schemarückschlussprozesses tritt ein Fehler auf.

Beispiele

In diesem Beispiel wird eine XML-Datei als Eingabe verwendet und ein Schema generiert, das das Beispiel-XML überprüfen kann.

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

Nachfolgend sehen Sie die EINGABE-XML-Datei.

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

Im Folgenden wird das Schema aus dem XML-Dokument abgeleitet.

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

Hinweise

Die InferSchema Methode leitet eine oder mehrere W3C-XML-Schemadefinitionssprache (XSD)-Schemaschemas aus dem XmlReader XML-Instanzdokument ab, das im angegebenen Objekt enthalten ist. Wenn das XML-Dokument Elemente und Attribute aus mehreren Namespaces enthält, werden mehrere Schemas generiert: eine für jeden namespace, der im Dokument verwendet wird. Das primäre Schema ist das Schema, das das gesamte XML-Dokument überprüfen kann, und der Zielnamespace entspricht dem Namespace des Dokumentelements des XML-Dokuments.

Im Folgenden sind wichtige Hinweise zur Verwendung der InferSchema Methode zu berücksichtigen.

  • Die InferSchema Methode ignoriert alle xsi:type, oder xsi:schemaLocation``xsi:noNamespaceSchemaLocation Attribute im XML-Dokument.

  • Wenn das Objekt eingegeben wird, wird die XmlReader Typinformationen, die sie enthält, ignoriert.

  • Wenn das XmlReader Objekt auf einem Element positioniert wird, das nicht das Stammelement des XML-Dokuments ist, wird ein Schema nur für dieses Element abgeleitet. Wenn das Objekt nicht auf einem Element positioniert ist, wird die XmlReader Read Methode auf dem XmlReader Parameter aufgerufen, bis ein Element aufgetreten ist (z. B. wenn ElementNodeType es sich um ein Element handelt). An diesem Punkt beginnt der Schlussfolgerungsprozess von diesem Element. Wenn bis zum Ende des Dokuments kein Element aufgetreten ist, wird ein ArgumentException Fehler ausgelöst.

Gilt für

InferSchema(XmlReader, XmlSchemaSet)

Leitet ein XSD-Schema (XML Schema Definition) von dem XML-Dokument ab, das im angegebenen XmlReader-Objekt enthalten ist, und passt das abgeleitete Schema mithilfe eines im XmlSchemaSet-Objekt vorhandenen Schemas an, das mit demselben Zielnamespace angegeben ist.

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

Parameter

instanceDocument
XmlReader

Ein XmlReader-Objekt, das das XML-Dokument enthält, von dem ein Schema abgeleitet werden soll.

schemas
XmlSchemaSet

Ein XmlSchemaSet-Objekt, das ein vorhandenes Schema enthält, das zum Anpassen des abgeleiteten Schemas verwendet wurde.

Gibt zurück

XmlSchemaSet

Ein XmlSchemaSet-Objekt, das die abgeleiteten Schemas enthält.

Ausnahmen

Das XML-Dokument ist nicht wohlgeformt.

Das XmlReader-Objekt ist nicht auf dem Stammknoten oder auf einem Element positioniert. Während des Schemarückschlussprozesses tritt ein Fehler auf.

Beispiele

Der folgende Beispielcode verwendet XML-Dokument 1 als Eingabe und generiert ein Schema, das XML-Dokument 1 überprüfen kann. Der Beispielcode verwendet dann XML-Dokument 2 und optimiert das schema, das aus XML-Dokument 1 generiert wird, basierend auf den Änderungen, die in XML-Dokument 2 gefunden wurden.

Nachfolgend sehen Sie das XML-Dokument 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>

Nachfolgend sehen Sie das XML-Dokument 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>

Im folgenden Beispielcode wird ein Schema aus dem ersten IN enthaltenen XML-Dokument abgeleitet und dann das abgeleitete Schema mit den Änderungen in dem zweiten XML-Dokument, das in reader``reader1enthalten ist, verfeinern. Der Beispielcode verwendet die erste überladene Methode, um das Schema zu verwenden, und die zweite überladene InferSchema InferSchema Methode, um das vorhandene Schema im XmlSchemaSet Objekt zu verfeinern.

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

Das folgende Schema ist das Schema, das von XML-Dokument 1 abgeleitet wird.

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

Das folgende Schema ist die verfeinerte Version des obigen Schemas basierend auf XML-Dokument 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>

Hinweise

Die InferSchema Methode leitet eine oder mehrere W3C-XML-Schemadefinitionssprache (XSD)-Schemaschemas aus dem XmlReader XML-Instanzdokument ab, das im angegebenen Objekt enthalten ist. Wenn das XML-Dokument Elemente und Attribute aus mehreren Namespaces enthält, werden mehrere Schemas generiert: eine für jeden im Dokument verwendeten Namespace. Das primäre Schema ist das Schema, das das gesamte XML-Dokument überprüfen kann, und der Zielnamespace entspricht dem Namespace des Dokumentelements des XML-Dokuments.

Im Folgenden sind wichtige Hinweise zur Verwendung der InferSchema Methode zu berücksichtigen.

  • Die InferSchema Methode ignoriert alle xsi:type, oder xsi:schemaLocation``xsi:noNamespaceSchemaLocation Attribute im XML-Dokument.

  • Wenn das Objekt eingegeben wird, wird die XmlReader Typinformationen, die sie enthält, ignoriert.

  • Wenn das XmlReader Objekt auf einem Element positioniert wird, das nicht das Stammelement des XML-Dokuments ist, wird ein Schema nur für dieses Element abgeleitet. Wenn das Objekt nicht auf einem Element positioniert ist, wird die XmlReader Read Methode auf dem XmlReader Parameter aufgerufen, bis ein Element aufgetreten ist (z. B. wenn ElementNodeType es sich um ein Element handelt). An diesem Punkt beginnt der Schlussfolgerungsprozess von diesem Element. Wenn bis zum Ende des Dokuments kein Element aufgetreten ist, wird ein ArgumentException Fehler ausgelöst.

  • Wenn ein Objekt als Parameter übergeben wird und das Element, auf dem das XmlReader Objekt positioniert ist, in einem der Schemas im XmlSchemaSetRahmen des Schemas definiert wird, wird das abgeleitete Schema verwendet, um ein XmlSchemaSet vorhandenes Schema im Parameter mit demselben Zielnamespace zu verfeinern. Andernfalls wird ein neues Schema für den XmlSchemaSet Namespace abgeleitet.

Gilt für