XmlSchemaInference.InferSchema 方法

定义

从指定的 XML 文档推理出 XML 架构定义语言 (XSD) 架构。

重载

InferSchema(XmlReader)

从指定的 XmlReader 对象包含的 XML 文档推理出 XML 架构定义语言 (XSD) 架构。

InferSchema(XmlReader, XmlSchemaSet)

从指定的 XmlReader 对象包含的 XML 文档推理出 XML 架构定义语言 (XSD) 架构,并通过用相同目标命名空间指定的 XmlSchemaSet 对象中的现有架构精炼已推理出的架构。

InferSchema(XmlReader)

从指定的 XmlReader 对象包含的 XML 文档推理出 XML 架构定义语言 (XSD) 架构。

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 从指定的对象中包含的 XmlReader XML 实例文档中推断一个或多个 W3C XML 架构定义语言 (XSD) 架构。 如果 XML 文档包含来自多个命名空间的元素和属性,则会生成多个架构:一个用于文档中使用的每个命名空间。 主架构是可以验证整个 XML 文档的架构,其目标命名空间与 XML 文档的文档元素的命名空间相同。

以下是使用 InferSchema 该方法时要考虑的重要说明。

  • 该方法InferSchema忽略 XML 文档中的任何xsi:type``xsi:schemaLocation属性或xsi:noNamespaceSchemaLocation属性。

  • XmlReader如果键入对象,则忽略它包含的类型信息。

  • XmlReader如果对象位于不是 XML 文档根元素的元素上,则仅推断该元素的架构。 XmlReader如果对象未定位在元素上,则在Read (遇到元素(例如,当) 时NodeType Element )之前,该方法将调用参数XmlReader。 此时,推理过程从该元素开始。 如果在文档末尾之前未遇到任何元素,则会引发一个 ArgumentException 元素。

适用于

InferSchema(XmlReader, XmlSchemaSet)

从指定的 XmlReader 对象包含的 XML 文档推理出 XML 架构定义语言 (XSD) 架构,并通过用相同目标命名空间指定的 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 文档 2 中找到的更改优化从 XML 文档 1 生成的架构。

下面是 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>

以下示例代码从包含 reader的第一个 XML 文档推断架构,然后使用包含在 reader1其中的第二个 XML 文档中的更改来优化推断的架构。 示例代码使用第一个重载方法推断架构,第二个重载InferSchemaInferSchema方法用于优化对象中的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 从指定的对象中包含的 XmlReader XML 实例文档中推断一个或多个 W3C XML 架构定义语言 (XSD) 架构。 如果 XML 文档包含来自多个命名空间的元素和属性,将生成多个架构:一个用于文档中使用的每个命名空间。 主架构是可以验证整个 XML 文档的架构,其目标命名空间与 XML 文档的文档元素的命名空间相同。

以下是使用 InferSchema 该方法时要考虑的重要说明。

  • 该方法InferSchema忽略 XML 文档中的任何xsi:type``xsi:schemaLocation属性或xsi:noNamespaceSchemaLocation属性。

  • XmlReader如果键入对象,则忽略它包含的类型信息。

  • XmlReader如果对象位于不是 XML 文档根元素的元素上,则仅推断该元素的架构。 XmlReader如果对象未定位在元素上,则在Read (遇到元素(例如,当) 时NodeType Element )之前,该方法将调用参数XmlReader。 此时,推理过程从该元素开始。 如果在文档末尾之前未遇到任何元素,则会引发一个 ArgumentException 元素。

  • XmlSchemaSet如果对象作为参数传递,并且该对象所定位的元素XmlReader在其中一个架构XmlSchemaSet中定义,则推断的架构用于使用同一目标命名空间优化参数中的XmlSchemaSet现有架构;否则,将为命名空间推断新的架构。

适用于