XmlSchemaInference.InferSchema Método

Definição

Infere um esquema da Linguagem de Definição de Esquemas XML (XSD) a partir do documento XML especificado.

Sobrecargas

Name Description
InferSchema(XmlReader)

Infere um esquema XML Schema Definition Language (XSD) a partir do documento XML contido no XmlReader objeto especificado.

InferSchema(XmlReader, XmlSchemaSet)

Infere um esquema XML Schema Definition Language (XSD) a partir do documento XML contido no XmlReader objeto especificado, e refina o esquema inferido usando um esquema existente no XmlSchemaSet objeto especificado com o mesmo namespace.

InferSchema(XmlReader)

Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs

Infere um esquema XML Schema Definition Language (XSD) a partir do documento XML contido no XmlReader objeto 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 XmlReader objeto contendo o documento XML para inferir um esquema.

Devoluções

Um objeto contendo XmlSchemaSet os esquemas inferidos.

Exceções

O documento XML não está bem elaborado.

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

Exemplos

Este exemplo recebe um ficheiro XML como entrada e gera um esquema que pode validar o XML de exemplo.

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

Segue-se o ficheiro 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>

Segue-se o esquema inferido a partir 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>

Observações

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

Seguem-se as notas importantes a considerar ao utilizar o InferSchema método.

  • O InferSchema método ignora quaisquer xsi:type, xsi:schemaLocation, ou xsi:noNamespaceSchemaLocation atributos no documento XML.

  • Se o XmlReader objeto for tipado, a informação de tipo que contém é ignorada.

  • Se o XmlReader objeto estiver posicionado num elemento que não é o elemento raiz do documento XML, um esquema é inferido apenas para esse elemento. Se o XmlReader objeto não estiver posicionado sobre um elemento, o Read método é 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 não for encontrado nenhum elemento até ao final do documento, um ArgumentException é lançado.

Aplica-se a

InferSchema(XmlReader, XmlSchemaSet)

Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs
Origem:
Infer.cs

Infere um esquema XML Schema Definition Language (XSD) a partir do documento XML contido no XmlReader objeto especificado, e refina o esquema inferido usando um esquema existente no XmlSchemaSet objeto especificado com o mesmo namespace.

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 XmlReader objeto contendo o documento XML para inferir um esquema.

schemas
XmlSchemaSet

Um XmlSchemaSet objeto contendo um esquema existente usado para refinar o esquema inferido.

Devoluções

Um objeto contendo XmlSchemaSet os esquemas inferidos.

Exceções

O documento XML não está bem elaborado.

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

Exemplos

O seguinte exemplo de código recebe o documento XML 1 como entrada e gera um esquema que pode validar o documento XML 1. O código de exemplo pega então no documento XML 2 e refina o esquema gerado a partir do documento XML 1, com base nas alterações encontradas no documento XML 2.

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

Segue-se 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 seguinte código de exemplo infere um esquema a partir do primeiro documento XML contido em reader, e depois 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 = 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 seguinte é 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 seguinte é a versão refinada do esquema acima, baseado 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>

Observações

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

Seguem-se as notas importantes a considerar ao utilizar o InferSchema método.

  • O InferSchema método ignora quaisquer xsi:type, xsi:schemaLocation, ou xsi:noNamespaceSchemaLocation atributos no documento XML.

  • Se o XmlReader objeto for tipado, a informação de tipo que contém é ignorada.

  • Se o XmlReader objeto estiver posicionado num elemento que não é o elemento raiz do documento XML, um esquema é inferido apenas para esse elemento. Se o XmlReader objeto não estiver posicionado sobre um elemento, o Read método é 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 não for encontrado nenhum elemento até ao final do documento, um ArgumentException é lançado.

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

Aplica-se a