次の方法で共有


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

スキーマの推論元となる XML ドキュメントが格納されている XmlReader オブジェクト。

戻り値

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 インスタンス ドキュメントから、1 つ以上の W3C XML スキーマ定義言語 (XSD) スキーマを XmlReader 推論します。 XML ドキュメントに複数の名前空間の要素と属性が含まれている場合、複数のスキーマが生成されます。ドキュメントで使用される名前空間ごとに 1 つ。 プライマリ スキーマは XML ドキュメント全体を検証できるスキーマであり、そのターゲット名前空間は XML ドキュメントのドキュメント要素の名前空間と同じです。

メソッドを使用する場合に考慮すべき重要な注意事項を次に InferSchema 示します。

  • このメソッドは InferSchema 、XML ドキュメント内の任意 xsi:typeの属性 xsi:schemaLocation(または xsi:noNamespaceSchemaLocation 属性) を無視します。

  • オブジェクトが XmlReader 型指定されている場合、オブジェクトに含まれる型情報は無視されます。

  • XML ドキュメントの XmlReader ルート要素ではない要素にオブジェクトが配置されている場合は、その要素に対してのみスキーマが推論されます。 オブジェクトが XmlReader 要素に配置されていない場合、メソッドは、 Read 要素が検出されるまでパラメーターで XmlReader 呼び出されます (例: is NodeType Element)。 この時点で、推論プロセスはその要素から開始されます。 ドキュメントの最後まで要素が見つからない場合は、an 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

スキーマの推論元となる XML ドキュメントが格納されている XmlReader オブジェクト。

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 ドキュメントからスキーマを推論し、次に、2 番目の XML ドキュメントに含まれる変更を使用して、推論されたスキーマを絞り込みます reader1。 このコード例では、最初のオーバーロードされた InferSchema メソッドを使用してスキーマを推論し、2 番目のオーバーロードされた 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 インスタンス ドキュメントから、1 つ以上の W3C XML スキーマ定義言語 (XSD) スキーマを XmlReader 推論します。 XML ドキュメントに複数の名前空間の要素と属性が含まれている場合は、複数のスキーマが生成されます。ドキュメントで使用される名前空間ごとに 1 つ。 プライマリ スキーマは XML ドキュメント全体を検証できるスキーマであり、そのターゲット名前空間は XML ドキュメントのドキュメント要素の名前空間と同じです。

メソッドを使用する場合に考慮すべき重要な注意事項を次に InferSchema 示します。

  • このメソッドは InferSchema 、XML ドキュメント内の任意 xsi:typeの属性 xsi:schemaLocation(または xsi:noNamespaceSchemaLocation 属性) を無視します。

  • オブジェクトが XmlReader 型指定されている場合、オブジェクトに含まれる型情報は無視されます。

  • XML ドキュメントの XmlReader ルート要素ではない要素にオブジェクトが配置されている場合は、その要素に対してのみスキーマが推論されます。 オブジェクトが XmlReader 要素に配置されていない場合、メソッドは、 Read 要素が検出されるまでパラメーターで XmlReader 呼び出されます (例: is NodeType Element)。 この時点で、推論プロセスはその要素から開始されます。 ドキュメントの最後まで要素が見つからない場合は、an ArgumentException がスローされます。

  • XmlSchemaSetオブジェクトがパラメーターとして渡され、オブジェクトが配置されるXmlReader要素が、その中のいずれかのスキーマでXmlSchemaSet定義されている場合、推論されたスキーマは、同じターゲット名前空間を持つパラメーター内XmlSchemaSetの既存のスキーマを絞り込むために使用されます。それ以外の場合は、名前空間に対して新しいスキーマが推論されます。

適用対象