Compartilhar via


XmlSchemaInference.InferSchema Método

Definição

Deduz um esquema XSD (linguagem de definição de esquema XML) do documento XML especificado.

Sobrecargas

InferSchema(XmlReader)

Deduz um esquema XSD (linguagem de definição de esquema XML) do documento XML contido no objeto XmlReader especificado.

InferSchema(XmlReader, XmlSchemaSet)

Deduz um esquema XSD (linguagem de definição de esquema XML) do documento XML contido no objeto XmlReader especificado e refina o esquema deduzido usando um esquema existente no objeto XmlSchemaSet especificado com o mesmo namespace de destino.

InferSchema(XmlReader)

Deduz um esquema XSD (linguagem de definição de esquema XML) do documento XML contido no objeto XmlReader especificado.

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

Parâmetros

instanceDocument
XmlReader

Um objeto XmlReader que contém o documento XML do qual um esquema será deduzido.

Retornos

XmlSchemaSet

Um objeto XmlSchemaSet que contém os esquemas deduzidos.

Exceções

O documento XML não está bem formado.

O objeto XmlReader não está posicionado no nó raiz nem em um elemento. Ocorrerá um erro durante o processo de inferência de esquema.

Exemplos

Este exemplo usa um arquivo XML como entrada e gera um esquema que pode validar o XML de exemplo.

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

Veja a seguir o arquivo XML de entrada.

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

Veja a seguir o esquema inferido do 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>

Comentários

O InferSchema método infere um ou mais esquemas XSD (Linguagem de Definição de Esquema XML) W3C do documento da instância XML contido no XmlReader objeto especificado. Se o documento XML contiver elementos e atributos de vários namespaces, vários esquemas serão gerados: um para cada namespace usado no documento. O esquema primário é o esquema que pode validar todo o documento XML e seu namespace de destino é o mesmo que o namespace do elemento de documento do documento XML.

Veja a seguir notas importantes a serem consideradas ao usar o InferSchema método.

  • O InferSchema método ignora qualquer xsi:type, xsi:schemaLocationou xsi:noNamespaceSchemaLocation atributos no documento XML.

  • Se o XmlReader objeto for digitado, as informações de tipo que ele contém serão ignoradas.

  • Se o XmlReader objeto estiver posicionado em um elemento que não seja o elemento raiz do documento XML, um esquema será inferido apenas para esse elemento. Se o XmlReader objeto não estiver posicionado em um elemento, o Read método será chamado no XmlReader parâmetro até que um elemento seja encontrado (por exemplo, quando NodeType é Element). Neste ponto, o processo de inferência começa a partir desse elemento. Se nenhum elemento for encontrado até o final do documento, um ArgumentException será gerado.

Aplica-se a

InferSchema(XmlReader, XmlSchemaSet)

Deduz um esquema XSD (linguagem de definição de esquema XML) do documento XML contido no objeto XmlReader especificado e refina o esquema deduzido usando um esquema existente no objeto XmlSchemaSet especificado com o mesmo namespace de destino.

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

Parâmetros

instanceDocument
XmlReader

Um objeto XmlReader que contém o documento XML do qual um esquema será deduzido.

schemas
XmlSchemaSet

Um objeto XmlSchemaSet que contém um esquema existente usado para refinar o esquema deduzido.

Retornos

XmlSchemaSet

Um objeto XmlSchemaSet que contém os esquemas deduzidos.

Exceções

O documento XML não está bem formado.

O objeto XmlReader não está posicionado no nó raiz nem em um elemento. Ocorrerá um erro durante o processo de inferência de esquema.

Exemplos

O código de exemplo a seguir usa o documento XML 1 como uma entrada e gera um esquema que pode validar o documento XML 1. Em seguida, o código de exemplo usa o documento XML 2 e refina o esquema gerado do documento XML 1, com base nas alterações encontradas no documento XML 2.

Veja a seguir o 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>

Veja a seguir o 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>

O código de exemplo a seguir infere um esquema do primeiro documento XML contido readere refina o esquema inferido com as alterações encontradas no segundo documento XML contido em reader1. O código de exemplo usa o primeiro método sobrecarregado InferSchema para inferir o esquema e o segundo método sobrecarregado InferSchema para refinar o esquema existente no XmlSchemaSet objeto.

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

O esquema a seguir é o esquema inferido do 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>

O esquema a seguir é a versão refinada do esquema acima, com base no 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>

Comentários

O InferSchema método infere um ou mais esquemas XSD (Linguagem de Definição de Esquema XML) W3C do documento da instância XML contido no XmlReader objeto especificado. Se o documento XML contiver elementos e atributos de vários namespaces, vários esquemas serão gerados: um para cada namespace usado no documento. O esquema primário é o esquema que pode validar todo o documento XML e seu namespace de destino é o mesmo que o namespace do elemento de documento do documento XML.

Veja a seguir notas importantes a serem consideradas ao usar o InferSchema método.

  • O InferSchema método ignora qualquer xsi:type, xsi:schemaLocationou xsi:noNamespaceSchemaLocation atributos no documento XML.

  • Se o XmlReader objeto for digitado, as informações de tipo que ele contém serão ignoradas.

  • Se o XmlReader objeto estiver posicionado em um elemento que não seja o elemento raiz do documento XML, um esquema será inferido apenas para esse elemento. Se o XmlReader objeto não estiver posicionado em um elemento, o Read método será chamado no XmlReader parâmetro até que um elemento seja encontrado (por exemplo, quando NodeType é Element). Neste ponto, o processo de inferência começa a partir desse elemento. Se nenhum elemento for encontrado até o final do documento, um ArgumentException será gerado.

  • Se um XmlSchemaSet objeto é passado como um parâmetro e o elemento no qual o XmlReader objeto está posicionado é definido em um dos esquemas no XmlSchemaSet, o esquema inferido é usado para refinar um esquema existente no XmlSchemaSet parâmetro com o mesmo namespace de destino; caso contrário, um novo esquema é inferido para o namespace.

Aplica-se a