none
XPath : rien

    Discussion générale

  • Bonjour tout le monde,

    J'ai deux applications qui se sortaient très bien des sélections XPath jusque là, et puis aujourd'hui, exception inattendue, je regarde ça de près : je ne retrouve plus mes petits au niveau de la syntaxe XPath.

    Je pars d'un fichier de description de DataSet :

    <?xml version="1.0" standalone="yes"?>
    <xs:schema id="DsProduct" targetNamespace="http://tempuri.org/DsProduct.xsd" xmlns:mstns="http://tempuri.org/DsProduct.xsd" xmlns="http://tempuri.org/DsProduct.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
      <xs:element name="DsProduct" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Product">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="ProductID" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int" />
                  <xs:element name="Name">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="50" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="ProductNumber">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="25" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="Color" minOccurs="0">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="15" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="StandardCost" type="xs:decimal" />
                  <xs:element name="ListPrice" type="xs:decimal" />
                  <xs:element name="Size" minOccurs="0">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="5" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="Weight" type="xs:decimal" minOccurs="0" />
                  <xs:element name="ProductCategoryID" type="xs:int" minOccurs="0" />
                  <xs:element name="ProductModelID" type="xs:int" minOccurs="0" />
                  <xs:element name="SellStartDate" type="xs:dateTime" />
                  <xs:element name="SellEndDate" type="xs:dateTime" minOccurs="0" />
                  <xs:element name="DiscontinuedDate" type="xs:dateTime" minOccurs="0" />
                  <xs:element name="ThumbNailPhoto" type="xs:base64Binary" minOccurs="0" />
                  <xs:element name="ThumbnailPhotoFileName" minOccurs="0">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="50" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="rowguid" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:string" />
                  <xs:element name="ModifiedDate" type="xs:dateTime" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
        <xs:unique name="Constraint1" msdata:PrimaryKey="true">
          <xs:selector xpath=".//mstns:Product" />
          <xs:field xpath="mstns:ProductID" />
        </xs:unique>
      </xs:element>
    </xs:schema>

    Pour simplifier les tests d'extraction XPath j'enlève le nom de domaine xs (remplacement de "xs:" par "").

    Ensuite je charge le fichier dans un xmlDocument xDoc, et je m'attends à ce que xDoc.SelectNodes("/schema") me retourne un tableau de nœuds avec un seul nœud dedans, le nœud schema qui se trouve à la racine.

    Eh bien non, ça me retourne un tableau vide.

    Est-ce que j'ai oublié quelque chose ?

    Ou bien on aurait changé la plateforme pendant la nuit ?

    Dans l'application qui génère un service WCF, j'ai ceci pour sélectionner l'identifiant de produit :

    XmlNamespaceManager nsm;

    nsm = new XmlNamespaceManager(doc.NameTable);

    string str = "/xs:schema/xs:element/xs:complexType/xs:choice/*[@name='Product']/xs:complexType/xs:sequence/*[@name='ProductId']" XmlNode nod = doc.SelectNodes(str, nsm)[0]

    eh bien ça ne me retourne rien, c'est comme ça que j'ai commencé à tester le chemin dans l'autre application.

    Si je retire le dernier segment du chemin, et que je m'en tiens à

    string str = "/xs:schema/xs:element/xs:complexType/xs:choice/*[@name='Product']/xs:complexType/xs:sequence

    là j'ai bien un nœud. Mais ce n'est pas celui-là que je prévoyais de viser.

    J'ai essayé avec et sans crochets autour de [ProductId].

    jeudi 21 avril 2016 15:06

Toutes les réponses

  • Bonjour, Gloops,

    Veuillez consulter le thread en bas :
    Why is XmlNamespaceManager necessary?
    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 22 avril 2016 13:58
    Modérateur
  • Bonjour,

    Quand un espace de noms est précisé dans un fichier xml, il doit être géré par un gestionnaire d'espace de noms passé en deuxième paramètre de SelectNodes ou SelectSingleNode.

    C'est bien ce que j'ai fait dans la syntaxe citée dans le deuxième encadré ci-dessus, extrait de mon application qui génère un service WCF, qui fonctionnait bien jusque là.

    Pour prendre un peu de recul, voyant que l'exception se produisait sur SelectNodes, pour tester la syntaxe xpath j'ai chargé le fichier dans mon gestionnaire d'extractions XSLT, qui bien entendu gère aussi des chemins xpath.

    Dans ce deuxième contexte, de façon à tester le chemin xpath sans avoir à gérer les espaces de noms, j'ai supprimé la référence à l'espace de noms. ça aurait été plus compliqué si il y en avait eu plusieurs, mais dans la mesure où tous les nœuds se trouvent dans le même espace de noms, il me semble que le chemin doit donner le même résultat si l'espace de noms vient à être l'espace de noms par défaut ?

    Si je me trompe sur ce dernier point, le recours au gestionnaire d'extractions xslt pour tester l'interprétation des chemins xpath va moins nous éclairer que prévu pour comprendre ce qui se passe dans la première application.

    Qu'en est-il ? Dois-je implémenter la gestion de l'espace de noms dans le gestionnaire d'extractions xslt pour qu'on comprenne ce qui se passe subitement dans le créateur de service WCF ?

    Le seul changement dont j'aie conscience concernant cette application-ci, est que lors de son développement je l'ai testée avec la base Northwind (et diverses autres), et que celle-ci n'étant plus installée je l'ai à présent testée avec AdventureWorks.

    Puis-je m'attendre à un changement significatif dans la syntaxe des fichiers de schéma de DataSet, en passant d'une base à l'autre ? Je dois bien avouer qu'a priori je ne me méfie pas trop de ça ...

    Ai-je tort de m'attendre à ce que l'exemple donné dans le deuxième encadré ci-dessus retourne un tableau avec un nœud, plutôt qu'une valeur nulle

    __
    (temporairement pour Theodora Sharkova :)
    Je ne me suis pas méfié que le motif de modification n'apparaît que pour la dernière modification.

    - avant-dernier paragraphe : lire fichier de schéma de DataSet, plutôt que fichier de structure

    - dernier paragraphe : l'exemple se trouve dans le deuxième encadré et non le troisième

    • Modifié Gloops vendredi 22 avril 2016 14:49
    vendredi 22 avril 2016 14:33