Partager via


XmlSchemaInference.InferSchema Méthode

Définition

Déduit un schéma en langage XSD (XML Schema Definition) du document XML spécifié.

Surcharges

InferSchema(XmlReader)

Déduit un schéma en langage XSD (XML Schema Definition) du document XML contenu dans l'objet XmlReader spécifié.

InferSchema(XmlReader, XmlSchemaSet)

Déduit un schéma en langage XSD (XML Schema Definition) du document XML contenu dans l'objet XmlReader spécifié et raffine le schéma déduit à l'aide d'un schéma existant dans l'objet XmlSchemaSet spécifié avec le même espace de noms cible.

InferSchema(XmlReader)

Déduit un schéma en langage XSD (XML Schema Definition) du document XML contenu dans l'objet XmlReader spécifié.

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

Paramètres

instanceDocument
XmlReader

Objet XmlReader contenant le document XML duquel déduire un schéma.

Retours

XmlSchemaSet

Objet XmlSchemaSet contenant les schémas déduits.

Exceptions

Le document XML n'est pas correct.

L'objet XmlReader n'est pas positionné sur le nœud racine ou sur un élément. Une erreur se produit pendant le processus d'inférence du schéma.

Exemples

Cet exemple utilise un fichier XML comme entrée et génère un schéma qui peut valider l’exemple 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

Voici le fichier XML d’entrée.

<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>

Voici le schéma déduit du document 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>

Remarques

La InferSchema méthode déduit un ou plusieurs schémas W3C XML Schema Definition Language (XSD) à partir du document d’instance XML contenu dans l’objet XmlReader spécifié. Si le document XML contient des éléments et des attributs de plusieurs espaces de noms, plusieurs schémas sont générés : un pour chaque espace de noms utilisé dans le document. Le schéma principal est le schéma qui peut valider l’intégralité du document XML, et son espace de noms cible est identique à l’espace de noms de l’élément de document du document XML.

Voici des notes importantes à prendre en compte lors de l’utilisation de la InferSchema méthode.

  • La InferSchema méthode ignore tous les attributs ou xsi:noNamespaceSchemaLocation xsi:schemaLocationtous xsi:typeles attributs du document XML.

  • Si l’objet XmlReader est typé, les informations de type qu’il contient sont ignorées.

  • Si l’objet XmlReader est positionné sur un élément qui n’est pas l’élément racine du document XML, un schéma est déduit pour cet élément uniquement. Si l’objet XmlReader n’est pas positionné sur un élément, la Read méthode est appelée sur le XmlReader paramètre jusqu’à ce qu’un élément soit rencontré (par exemple, le cas NodeType échéant Element). À ce stade, le processus d’inférence commence à partir de cet élément. Si aucun élément n’est rencontré jusqu’à la fin du document, un ArgumentException élément est levée.

S’applique à

InferSchema(XmlReader, XmlSchemaSet)

Déduit un schéma en langage XSD (XML Schema Definition) du document XML contenu dans l'objet XmlReader spécifié et raffine le schéma déduit à l'aide d'un schéma existant dans l'objet XmlSchemaSet spécifié avec le même espace de noms cible.

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

Paramètres

instanceDocument
XmlReader

Objet XmlReader contenant le document XML duquel déduire un schéma.

schemas
XmlSchemaSet

Objet XmlSchemaSet contenant un schéma existant utilisé pour raffiner le schéma déduit.

Retours

XmlSchemaSet

Objet XmlSchemaSet contenant les schémas déduits.

Exceptions

Le document XML n'est pas correct.

L'objet XmlReader n'est pas positionné sur le nœud racine ou sur un élément. Une erreur se produit pendant le processus d'inférence du schéma.

Exemples

L’exemple de code suivant prend le document XML 1 comme entrée et génère un schéma qui peut valider le document XML 1. L’exemple de code prend ensuite le document XML 2 et affinera le schéma généré à partir du document XML 1, en fonction des modifications trouvées dans le document XML 2.

Voici le document 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>

Voici le document 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>

L’exemple de code suivant déduit un schéma du premier document XML contenu dans reader, puis affiner le schéma déduit avec les modifications trouvées dans le deuxième document XML contenu dans reader1. L’exemple de code utilise la première méthode surchargée pour déduire le schéma et la deuxième méthode surchargée InferSchema InferSchema pour affiner le schéma existant dans l’objet 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

Le schéma suivant est le schéma déduit du document 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>

Le schéma suivant est la version affinée du schéma ci-dessus, basée sur le document 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>

Remarques

La InferSchema méthode déduit un ou plusieurs schémas W3C XML Schema Definition Language (XSD) à partir du document d’instance XML contenu dans l’objet XmlReader spécifié. Si le document XML contient des éléments et des attributs de plusieurs espaces de noms, plusieurs schémas sont générés : un pour chaque espace de noms utilisé dans le document. Le schéma principal est le schéma qui peut valider l’intégralité du document XML, et son espace de noms cible est identique à l’espace de noms de l’élément de document du document XML.

Voici des notes importantes à prendre en compte lors de l’utilisation de la InferSchema méthode.

  • La InferSchema méthode ignore tous les attributs ou xsi:noNamespaceSchemaLocation xsi:schemaLocationtous xsi:typeles attributs du document XML.

  • Si l’objet XmlReader est typé, les informations de type qu’il contient sont ignorées.

  • Si l’objet XmlReader est positionné sur un élément qui n’est pas l’élément racine du document XML, un schéma est déduit pour cet élément uniquement. Si l’objet XmlReader n’est pas positionné sur un élément, la Read méthode est appelée sur le XmlReader paramètre jusqu’à ce qu’un élément soit rencontré (par exemple, le cas NodeType échéant Element). À ce stade, le processus d’inférence commence à partir de cet élément. Si aucun élément n’est rencontré jusqu’à la fin du document, un ArgumentException élément est levée.

  • Si un XmlSchemaSet objet est passé en tant que paramètre et que l’élément sur lequel l’objet XmlReader est positionné est défini dans l’un des schémas du XmlSchemaSet, le schéma déduit est utilisé pour affiner un schéma existant dans le XmlSchemaSet paramètre avec le même espace de noms cible ; sinon, un nouveau schéma est déduit pour l’espace de noms.

S’applique à