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 在 參數上 XmlReader 呼叫 方法,直到遇到專案 (例如,當 為) 時 NodeType Element 。 此時,推斷程式會從該元素開始。 如果在檔結尾之前未遇到任何專案, 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 檔推斷架構,然後使用 中第二個 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 會從指定的 物件中包含的 XmlReader XML 實例檔推斷一或多個 W3C XML 架構定義語言 (XSD) 架構。 如果 XML 檔包含多個命名空間中的元素和屬性,就會產生多個架構:檔中所使用的每個命名空間各產生一個架構。 主要架構是可以驗證整個 XML 檔的架構,而其目標命名空間與 XML 檔之檔元素的命名空間相同。
以下是使用 InferSchema 方法時要考慮的重要注意事項。
方法 InferSchema 會忽略 XML 檔中的任何
xsi:type
、xsi:schemaLocation
或xsi:noNamespaceSchemaLocation
屬性。XmlReader如果物件是具型別的,則會忽略它所包含的類型資訊。
XmlReader如果物件位於不是 XML 檔的根項目上,則只會針對該元素推斷架構。 XmlReader如果物件不在元素上,則會 Read 在 參數上 XmlReader 呼叫 方法,直到遇到專案 (例如,當 為) 時 NodeType Element 。 此時,推斷程式會從該元素開始。 如果在檔結尾之前未遇到任何專案, ArgumentException 則會擲回 。
XmlSchemaSet如果將物件當做參數傳遞,而且物件所在的專案 XmlReader 定義在 的 XmlSchemaSet 其中一個架構中,則推斷的架構會用來精簡參數中 XmlSchemaSet 具有相同目標命名空間的現有架構;否則,會推斷命名空間的新架構。