共用方式為


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:typexsi:schemaLocationxsi: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

參數

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 檔推斷架構,然後使用 中第二個 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:typexsi:schemaLocationxsi:noNamespaceSchemaLocation 屬性。

  • XmlReader如果物件是具型別的,則會忽略它所包含的類型資訊。

  • XmlReader如果物件位於不是 XML 檔的根項目上,則只會針對該元素推斷架構。 XmlReader如果物件不在元素上,則會 Read 在 參數上 XmlReader 呼叫 方法,直到遇到專案 (例如,當 為) 時 NodeType Element 。 此時,推斷程式會從該元素開始。 如果在檔結尾之前未遇到任何專案, ArgumentException 則會擲回 。

  • XmlSchemaSet如果將物件當做參數傳遞,而且物件所在的專案 XmlReader 定義在 的 XmlSchemaSet 其中一個架構中,則推斷的架構會用來精簡參數中 XmlSchemaSet 具有相同目標命名空間的現有架構;否則,會推斷命名空間的新架構。

適用於