XmlSchemaInference.InferSchema Метод

Определение

Определяет схему языка определения схем XML (XSD) на основе заданного документа XML.

Перегрузки

InferSchema(XmlReader)

Определяет схему языка определения схем XML (XSD) на основе документа XML, содержащегося в указанном объекте XmlReader.

InferSchema(XmlReader, XmlSchemaSet)

Определяет схему языка определения схем XML (XSD) на основе документа XML, содержащегося в заданном объекте XmlReader, а также уточняет определенную схему, используя существующую схему из объекта XmlSchemaSet, заданную для того же целевого пространства имен.

InferSchema(XmlReader)

Определяет схему языка определения схем XML (XSD) на основе документа XML, содержащегося в указанном объекте XmlReader.

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

Параметры

instanceDocument
XmlReader

Объект XmlReader, содержащий документ XML, на основе которого будет определяться схема.

Возвращаемое значение

XmlSchemaSet

Объект XmlSchemaSet, содержащий определенные схемы.

Исключения

Документ XML не является правильно сформированным.

Объект XmlReader не расположен на корневом узле или на элементе. Во время процесса выведения схемы происходит ошибка.

Примеры

Этот пример принимает XML-файл в качестве входных данных и создает схему, которая может проверить пример 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

Ниже приведен входной 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>

Ниже приведена схема, полученная из 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>

Комментарии

Метод InferSchema выводит одну или несколько схем языка определения схемы XML W3C (XSD) из документа экземпляра XML, содержащегося в указанном объекте XmlReader . Если XML-документ содержит элементы и атрибуты из нескольких пространств имен, создается несколько схем: по одному для каждого пространства имен, используемого в документе. Основная схема — это схема, которая может проверить весь XML-документ, а целевое пространство имен совпадает с пространством имен элемента документа XML-документа.

Ниже приведены важные примечания, которые следует учитывать при использовании InferSchema метода.

  • Метод InferSchema игнорирует любые xsi:type``xsi:schemaLocationатрибуты или xsi:noNamespaceSchemaLocation атрибуты в XML-документе.

  • XmlReader Если объект типируется, сведения о типе, содержащиеся в нем, игнорируются.

  • XmlReader Если объект расположен на элементе, который не является корневым элементом XML-документа, схема выводится только для этого элемента. XmlReader Если объект не размещается в элементе, метод вызывается в XmlReader параметре до тех пор, Read пока не будет обнаружен элемент (например, когда NodeType естьElement). На этом этапе процесс вывода начинается с этого элемента. Если элемент не обнаружен до конца документа, ArgumentException создается исключение.

Применяется к

InferSchema(XmlReader, XmlSchemaSet)

Определяет схему языка определения схем XML (XSD) на основе документа XML, содержащегося в заданном объекте XmlReader, а также уточняет определенную схему, используя существующую схему из объекта XmlSchemaSet, заданную для того же целевого пространства имен.

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

Параметры

instanceDocument
XmlReader

Объект XmlReader, содержащий документ XML, на основе которого будет определяться схема.

schemas
XmlSchemaSet

Объект XmlSchemaSet, содержащий существующую схему, которая используется для уточнения определяемой схемы.

Возвращаемое значение

XmlSchemaSet

Объект XmlSchemaSet, содержащий определенные схемы.

Исключения

Документ XML не является правильно сформированным.

Объект XmlReader не расположен на корневом узле или на элементе. Во время процесса выведения схемы происходит ошибка.

Примеры

Следующий пример кода принимает XML-документ 1 в качестве входных данных и создает схему, которая может проверить XML-документ 1. Затем пример кода принимает XML-документ 2 и уточняет схему, созданную из XML-документа 1, на основе изменений, найденных в XML-документе 2.

Ниже приведен 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>

Ниже приведен 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>

Следующий пример кода выводит схему из первого XML-документа, содержащегося в reader, а затем уточняет выводимую схему с изменениями, найденными во втором XML-документе reader1. В примере кода используется первый перегруженный InferSchema метод для вывода схемы, а второй перегруженный InferSchema метод — для уточнения существующей схемы в объекте XmlSchemaSet .

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

Следующая схема выводится из 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>

Следующая схема является уточненной версией приведенной выше схемы на основе 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>

Комментарии

Метод InferSchema выводит одну или несколько схем языка определения схемы XML W3C (XSD) из документа экземпляра XML, содержащегося в указанном объекте XmlReader . Если XML-документ содержит элементы и атрибуты из нескольких пространств имен, создается несколько схем: по одному для каждого пространства имен, используемого в документе. Основная схема — это схема, которая может проверить весь XML-документ, а целевое пространство имен совпадает с пространством имен элемента документа XML-документа.

Ниже приведены важные примечания, которые следует учитывать при использовании InferSchema метода.

  • Метод InferSchema игнорирует любые xsi:type``xsi:schemaLocationатрибуты или xsi:noNamespaceSchemaLocation атрибуты в XML-документе.

  • XmlReader Если объект типируется, сведения о типе, содержащиеся в нем, игнорируются.

  • XmlReader Если объект расположен на элементе, который не является корневым элементом XML-документа, схема выводится только для этого элемента. XmlReader Если объект не размещается в элементе, метод вызывается в XmlReader параметре до тех пор, Read пока не будет обнаружен элемент (например, когда NodeType естьElement). На этом этапе процесс вывода начинается с этого элемента. Если элемент не обнаружен до конца документа, ArgumentException создается исключение.

  • XmlSchemaSet Если объект передается в качестве параметра и элемент, на котором XmlReader размещается объект, определен в одной из схем в этой XmlSchemaSetсхеме, выводимые схемы используются для уточнения существующей схемы в параметре с тем же целевым пространством имен; в XmlSchemaSet противном случае новая схема выводится для пространства имен.

Применяется к