XmlSchemaInference.InferSchema 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
从指定的 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
参数
返回
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
参数
- schemas
- 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现有架构;否则,将为命名空间推断新的架构。