Masquage d'éléments et d'attributs à l'aide de sql:hide

Lorsqu'une requête XPath est exécutée contre un schéma XSD, le document XML résultant possède des éléments et des attributs spécifiés dans le schéma. Vous pouvez spécifier que certains éléments et attributs soient masqués dans le schéma en utilisant l'annotation sql:hide. Cela est utile lorsque les critères de sélection de la requête requièrent des éléments ou des attributs particuliers dans le schéma, mais que vous ne souhaitez pas les retourner dans le document XML généré.

L'annotation sql:hide prend une valeur booléenne (0=faux, 1=vrai). Les valeurs acceptables sont 0, 1, true et false.

Exemples

Pour créer des exemples fonctionnels à l'aide des exemples suivants, vous devez remplir certaines conditions. Pour plus d'informations, consultez Configuration requise pour l'exécution des exemples SQLXML.

A. Spécification de sql:hide sur un attribut

Dans cet exemple, le schéma XSD comprend un élément <Person.Person> avec les attributs BusinessEntityID, FirstName et LastName.

L'élément <Person.Person> est de type complexe et, par conséquent, est mappé à la table du même nom (mappage par défaut). Tous les attributs de l'élément <Person.Person> sont de type simple et sont mappés aux colonnes du même nom dans la table Person.Person de la base de données AdventureWorks2008R2. Dans le schéma, l'annotation sql:hide est spécifiée sur l'attribut BusinessEntityID. Lorsqu'une requête XPath est spécifiée sur ce schéma, le BusinessEntityID n'est pas retourné dans le document XML.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Person.Person" >
     <xsd:complexType>
       <xsd:attribute name="BusinessEntityID"  sql:hide="true" /> 
       <xsd:attribute name="FirstName"   type="xsd:string" /> 
       <xsd:attribute name="LastName"    type="xsd:string" /> 
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

Pour tester un exemple de requête XPath par rapport au schéma

  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom Hide.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez le fichier sous le nom HideT.xml dans le répertoire où vous avez enregistré le fichier Hide.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
        <sql:xpath-query mapping-schema="Hide.xml">
            /Person.Person[@BusinessEntityID="1"]
        </sql:xpath-query>
    </ROOT>
    

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (Hide.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :

    mapping-schema="C:\MyDir\Hide.xml"
    
  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

    Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.

Voici le jeu de résultats obtenu :

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
    <Person.Person FirstName="Gustavo" LastName="Achong" /> 
 </ROOT>

Lorsque sql:hide est spécifié sur un élément, celui-ci et ses attributs ou éléments enfants n'apparaissent pas dans le document XML généré. Voici un autre schéma XSD dans lequel sql:hide est spécifié sur l'élément <OD> :

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:dt="urn:schemas-microsoft-com:datatypes"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

  <xsd:annotation>
    <xsd:documentation>
      Sales.Customer-Sales.SalesOrderHeader-Sales.SalesOrderDetail Schema
      Copyright 2004 Microsoft. All rights reserved.
    </xsd:documentation>
    <xsd:appinfo>
      <sql:relationship name="CustomerOrder"
         parent="Sales.Customer"
                  parent-key="CustomerID"
                  child-key="CustomerID"
                  child="Sales.SalesOrderHeader" />
       <sql:relationship name="OrderOrderDetails"
                  parent="Sales.SalesOrderHeader"
                  parent-key="SalesOrderID"
                  child-key="SalesOrderID"
                  child="Sales.SalesOrderDetail"/>
    </xsd:appinfo>
  </xsd:annotation>

  <xsd:element name="Customers" sql:relation="Sales.Customer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" 
                     maxOccurs="unbounded" 
                     sql:relationship="CustomerOrder">
          <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="OD" sql:relation="Sales.SalesOrderDetail"                                       maxOccurs="unbounded"                                       sql:relationship="OrderOrderDetails"                                       sql:hide="1">
                  <xsd:complexType>
                    <xsd:attribute name="SalesOrderID" type="xsd:string"/>
                    <xsd:attribute name="ProductID" type="xsd:string"/>
                  </xsd:complexType>
               </xsd:element>
            </xsd:sequence>
          <xsd:attribute name="CustomerID" type="xsd:string"/>
          <xsd:attribute name="OID" sql:field="SalesOrderID" 
                                    type="xsd:string"/>
          <xsd:attribute name="OrderDate" type="xsd:date"/> 
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="CID" sql:field="CustomerID" 
                                type="xsd:string"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Lorsqu'une requête XPath (par exemple /Customers[@CID="1"]) est spécifiée contre ce schéma, le document XML généré n'inclut pas l'élément <OD> et ses enfants, comme illustré dans ce résultat partiel :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Customers CID="1">
    <Order CustomerID="1" OID="43860" OrderDate="2005-08-01" /> 
    <Order CustomerID="1" OID="44501" OrderDate="2005-11-01" /> 
    <Order CustomerID="1" OID="45283" OrderDate="2006-02-01" /> 
    <Order CustomerID="1" OID="46042" OrderDate="2006-05-01" /> 
  </Customers>
</ROOT>