Compartir vía


XmlSchemaInference.InferSchema Método

Definición

Infiere un esquema del lenguaje de definición de esquemas XML (XSD) a partir de un documento XML especificado.

Sobrecargas

InferSchema(XmlReader)

Infiere un esquema del lenguaje de definición de esquemas XML (XSD) a partir del documento XML incluido en el objeto XmlReader especificado.

InferSchema(XmlReader, XmlSchemaSet)

Infiere un esquema del lenguaje de definición de esquemas XML (XSD) a partir del documento XML incluido en el objeto XmlReader especificado, y refina el esquema inferido utilizando un esquema existente en el objeto XmlSchemaSet especificado con el mismo espacio de nombres de destino.

InferSchema(XmlReader)

Infiere un esquema del lenguaje de definición de esquemas XML (XSD) a partir del documento XML incluido en el 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

Objeto XmlReader que contiene el documento XML del que se va a inferir un esquema.

Devoluciones

XmlSchemaSet

Objeto XmlSchemaSet que contiene los esquemas inferidos.

Excepciones

El documento XML no tiene un formato correcto.

El objeto XmlReader no se coloca en el nodo raíz ni en un elemento. Se produce un error durante el proceso de inferencia del esquema.

Ejemplos

En este ejemplo se toma un archivo XML como entrada y se genera un esquema que puede validar el XML de ejemplo.

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

A continuación se muestra el archivo 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>

A continuación se muestra el esquema inferido del 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>

Comentarios

El InferSchema método deduce uno o varios esquemas del lenguaje de definición de esquema XML (XSD) W3C del documento de instancia XML contenido en el XmlReader objeto especificado. Si el documento XML contiene elementos y atributos de varios espacios de nombres, se generan varios esquemas: uno para cada espacio de nombres usado en el documento. El esquema principal es el esquema que puede validar todo el documento XML y su espacio de nombres de destino es el mismo que el espacio de nombres del elemento de documento del documento XML.

A continuación se muestran notas importantes que se deben tener en cuenta al usar el InferSchema método .

  • El InferSchema método omite los xsi:typeatributos , xsi:schemaLocationo xsi:noNamespaceSchemaLocation del documento XML.

  • Si se escribe el XmlReader objeto, se omite la información de tipo que contiene.

  • Si el XmlReader objeto se coloca en un elemento que no es el elemento raíz del documento XML, solo se deduce un esquema para ese elemento. Si el XmlReader objeto no está colocado en un elemento, se llama al Read método en el XmlReader parámetro hasta que se encuentra un elemento (por ejemplo, cuando NodeType es Element). En este momento, el proceso de inferencia comienza desde ese elemento. Si no se encuentra ningún elemento hasta el final del documento, se produce una ArgumentException excepción .

Se aplica a

InferSchema(XmlReader, XmlSchemaSet)

Infiere un esquema del lenguaje de definición de esquemas XML (XSD) a partir del documento XML incluido en el objeto XmlReader especificado, y refina el esquema inferido utilizando un esquema existente en el objeto XmlSchemaSet especificado con el mismo espacio de nombres 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

Objeto XmlReader que contiene el documento XML del que se va a inferir un esquema.

schemas
XmlSchemaSet

Objeto XmlSchemaSet que contiene un esquema existente utilizado para refinar el esquema inferido.

Devoluciones

XmlSchemaSet

Objeto XmlSchemaSet que contiene los esquemas inferidos.

Excepciones

El documento XML no tiene un formato correcto.

El objeto XmlReader no se coloca en el nodo raíz ni en un elemento. Se produce un error durante el proceso de inferencia del esquema.

Ejemplos

El código de ejemplo siguiente toma el documento XML 1 como entrada y genera un esquema que puede validar el documento XML 1. A continuación, el código de ejemplo toma el documento XML 2 y refina el esquema generado a partir del documento XML 1, en función de los cambios encontrados en el documento XML 2.

A continuación se muestra el 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>

A continuación se muestra el 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>

En el código de ejemplo siguiente se deduce un esquema del primer documento XML incluido en readery, a continuación, se refina el esquema inferido con los cambios encontrados en el segundo documento XML incluido en reader1. El código de ejemplo usa el primer método sobrecargado InferSchema para deducir el esquema y el segundo método sobrecargado InferSchema para refinar el esquema existente en el 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

El esquema siguiente es el esquema inferido del 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>

El esquema siguiente es la versión refinada del esquema anterior, basada en el 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>

Comentarios

El InferSchema método deduce uno o varios esquemas del lenguaje de definición de esquema XML (XSD) W3C del documento de instancia XML contenido en el XmlReader objeto especificado. Si el documento XML contiene elementos y atributos de varios espacios de nombres, se generan varios esquemas: uno para cada espacio de nombres usado en el documento. El esquema principal es el esquema que puede validar todo el documento XML y su espacio de nombres de destino es el mismo que el espacio de nombres del elemento de documento del documento XML.

A continuación se muestran notas importantes que se deben tener en cuenta al usar el InferSchema método .

  • El InferSchema método omite los xsi:typeatributos , xsi:schemaLocationo xsi:noNamespaceSchemaLocation del documento XML.

  • Si se escribe el XmlReader objeto, se omite la información de tipo que contiene.

  • Si el XmlReader objeto se coloca en un elemento que no es el elemento raíz del documento XML, solo se deduce un esquema para ese elemento. Si el XmlReader objeto no está colocado en un elemento, se llama al Read método en el XmlReader parámetro hasta que se encuentra un elemento (por ejemplo, cuando NodeType es Element). En este momento, el proceso de inferencia comienza desde ese elemento. Si no se encuentra ningún elemento hasta el final del documento, se produce una ArgumentException excepción .

  • Si se pasa un XmlSchemaSet objeto como parámetro y el elemento en el que se coloca el XmlReader objeto se define en uno de los esquemas de XmlSchemaSet, el esquema inferido se usa para refinar un esquema existente en el XmlSchemaSet parámetro con el mismo espacio de nombres de destino; de lo contrario, se deduce un nuevo esquema para el espacio de nombres.

Se aplica a