none
Comment charger et requeter un XML complexe avec Xpath dans un DetailsView? RRS feed

  • Question

  • Bonjour,

    J'ai dans ma page aspx un DetailsView que je bind avec un xmldatasource.

    Dans ce DetailsView, j'aimerai afficher certains champs en utilisant Xpath mais le problème est que mon xml contient des namespaces.

    Du coup, quand je charge mon XML, il me retourne 0 résultats.

    Voici d'abord ma méthode où j'initialise le xmldatasource:

            protected void XmlDataSource_Init(object sender, EventArgs e)
            {
                if (Session["jobkey"] != null)
                {
                    XmlDataSource ds = sender as XmlDataSource;
                    ds.DataFile = "~/chemin_vers_mon_xml.xml";
                    ds.XPath = "Mon_element_racine";
                }
            }

    Le problème viens d'ici, je ne sais pas comment donner en argument un Namespacemanager afin de récupérer correctement le contenu de mon xml.

    Le second problème est que je ne pourrais certainement pas requeter mon datasource une fois chargé si je n'ai pas les infos de namespace correspondantes:

    <asp:TextBox ID="AnamHtb" Width="50" Text='<%# XPath("//eg:SmartName[@Name=AnamorphoseH]@Value") %>' OnTextChanged="AnamHtb_TextChanged" runat="server"></asp:TextBox>

    Pour finir voici un extrait du xml associé:

    <JDF xmlns="http://www.CIP4.org/JDFSchema_1_1" xmlns:eg="http://www.esko-graphics.com/EGSchema1_0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Product">
        <ResourcePool>
            <eg:SmartNames ID="sn1A001" Status="Available">
                <eg:SmartName Name="AnamorphoseH" Value="100" />
                <eg:SmartName Name="AnamorphoseV" Value="100" />
                <eg:SmartName Name="EchelleH" Value="100" />
                <eg:SmartName Name="EchelleV" Value="100" />
                <eg:SmartName Name="Rotation" Value="0" />
            </eg:SmartNames>
    ...

    Je compte sur votre aide,

    Merci.

    Erwan

    mardi 15 mai 2012 13:11

Réponses

  • Passer par une feuille de style XSL générant un format XML pivot simple que vous définissez sans espaces de noms avec des chemins XPATH simples résoudrait vos problèmes. Pour ce faire, vous avez le choix entre deux possibilités:

    1. Faire la feuille de style XSL dans un fichier dédié et la référencer dans la XMLDataSource via la propriété TransformFile
    2. Faire la feuille de style directement dans votre page ASP via la propriété Transform

    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse Erwanage vendredi 18 mai 2012 13:15
    mardi 15 mai 2012 19:36
    Auteur de réponse
  • J'ai fini par trouver la solution:

    Mon erreur invalid token venait du "/string()" à la fin de mon XPath.

    En résumé, j'ai supprimé les namespaces dans un xml pivot en regardant comment faire via ce lien:

    http://geekswithblogs.net/evjen/archive/2005/10/10/56527.aspx

    Ensuite, j'ai effectué mes requête comme sur un xml simple.

    Mais pour sauvegarder mes modifications, je dois utiliser un XmlNameSpaceManager afin de garder mes namespaces dans le fichier de sortie (car je suis obligé de les garder).

    • Marqué comme réponse Erwanage vendredi 18 mai 2012 13:14
    vendredi 18 mai 2012 13:14

Toutes les réponses

  • Bonjour,

    Je ne sais pas si c'est toujours d'actualité mais cela n'a pas l'air très engageant :

    http://jasonf-blog.blogspot.fr/2006/08/xmldatasource-xpath-workaround-for.html

    Il semblerait que XmlDataSource ne gérait (ne gère toujours ?) pas les namespaces...

    Ce même article dirige par exemple vers http://geekswithblogs.net/evjen/archive/2005/10/10/56527.aspx pour supprimer les namespaces (si cela ne pose pas problème, cela serait peut-être aussi simple effectivement de les supprimer d'autant plus si on ne peut pas faire autrement !).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 15 mai 2012 17:43
    Modérateur
  • Passer par une feuille de style XSL générant un format XML pivot simple que vous définissez sans espaces de noms avec des chemins XPATH simples résoudrait vos problèmes. Pour ce faire, vous avez le choix entre deux possibilités:

    1. Faire la feuille de style XSL dans un fichier dédié et la référencer dans la XMLDataSource via la propriété TransformFile
    2. Faire la feuille de style directement dans votre page ASP via la propriété Transform

    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse Erwanage vendredi 18 mai 2012 13:15
    mardi 15 mai 2012 19:36
    Auteur de réponse
  • Merci pour le lien.

    J'ai pu avancer dans mon problème.

    Pour mon xml data source, je charge l'élément racine comme ceci:

    ds.XPath = "/*[local-name()='JDF' and namespace-uri()='http://www.CIP4.org/JDFSchema_1_1']/*";

    Je rencontre maintenant un problème pour requeter mon datasource spécifiquement pour les dropdownlist:

    <asp:DropDownList ID="Rotationddl" runat="server" AutoPostBack="true" 
    SelectedValue='<%# XPath("/*[local-name()="SmartName"
     and namespace-uri()="http://www.esko-graphics.com/EGSchema1_0"
     and @Name="Rotation"]/@Value/string()") %>'>
    <asp:ListItem Text="0" Value="0"></asp:ListItem>
    <asp:ListItem Text="90" Value="90"></asp:ListItem>
    <asp:ListItem Text="180" Value="180"></asp:ListItem>
    <asp:ListItem Text="270" Value="270"></asp:ListItem></asp:DropDownList>
    

    Si je met un # avant mon XPath, j'obtiens l'erreur: The SelectedValue property cannot be set declaratively

    Et si je remplace par un = j'obtiens : asp.net CS1026: ) expected

    mercredi 16 mai 2012 10:46
  • Il y a des " qui délimitent la chaine et encore " à l'intérieur. Je pense qu'il faut donc sans doute échapper les guillemets internes avec par exemple \".

    Le choix de consommer directement le fichier XML est-il imposé ? Je me demande si il ne serait pas plus simple d'exposer le fichier XML sous forme d'objets avec LINQ to XML par exemple et de faire la liaison de données sur ces objets (notamment si on consomme ce fichier dans différents contextes).

    Eventuellement voir http://msdn.microsoft.com/fr-fr/library/bb675178.aspx


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 16 mai 2012 11:00
    Modérateur
  • Si j'échappe tous les caractères " internes j'obtiens :

    '/*[local-name()="SmartName" and namespace-uri()="http://www.esko-graphics.com/EGSchema1_0" and @Name="Rotation"]/@Value/string()' has an invalid token.

    Mais je ne vois pas quel caractère ne vas pas.

    Est ce que vous avez des exemples ou un tuto de LINQ to XML?

    Comment converti-t-on le xml sous forme d'objet et ensuite comment requeter dessus dans mon DetailsView?

    Est-ce qu'il faut remplacer le xmldatasource par un nouveau type de datasource?

    mercredi 16 mai 2012 12:12
  • @Link.fr:

    Est-ce que cette méthode supprime définitivement les namespaces?

    Ou bien, si je modifie mon fichier xml via mon detailsview, est ce que les namespaces seront sauvegardé pour l'utilisation future de ce fichier?

    mercredi 16 mai 2012 12:26
  • Le fichier XML source n'ai pas modifié. XmlDataSource construit un autre fichier XML à partir du fichier source via la feuille de style XSLT. Bien sûr dans le fichier XML de sortie vous pouvez enlever tous les namespaces en utilisant exclude-result-prefixes.

    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    jeudi 17 mai 2012 20:27
    Auteur de réponse
  • Je suis passé par une feuille xsl afin de supprimer les namespace comme dans l'exemple suivant:

    http://geekswithblogs.net/evjen/archive/2005/10/10/56527.aspx

    Cependant, je n'arrive toujours pas à accéder à mes valeurs via Xpath.

    <asp:TextBox ID="AnamVtb" Width="50" Text='<%# XPath("/ResourcePool/SmartNames/SmartName[@Name=\"AnamorphoseV\"]/@Value/string()") %>' 

    Me renvoie l'erreur suivante :

    System.Xml.XPath.XPathException: '/ResourcePool/SmartNames/SmartName[@Name="AnamorphoseV"]/@Value/string()' has an invalid token

    Est ce que cela peut venir de ma version de Xpath installée?

    • Modifié Erwanage vendredi 18 mai 2012 08:23
    • Marqué comme réponse Erwanage vendredi 18 mai 2012 13:14
    • Non marqué comme réponse Erwanage vendredi 18 mai 2012 13:14
    vendredi 18 mai 2012 07:17
  • J'ai fini par trouver la solution:

    Mon erreur invalid token venait du "/string()" à la fin de mon XPath.

    En résumé, j'ai supprimé les namespaces dans un xml pivot en regardant comment faire via ce lien:

    http://geekswithblogs.net/evjen/archive/2005/10/10/56527.aspx

    Ensuite, j'ai effectué mes requête comme sur un xml simple.

    Mais pour sauvegarder mes modifications, je dois utiliser un XmlNameSpaceManager afin de garder mes namespaces dans le fichier de sortie (car je suis obligé de les garder).

    • Marqué comme réponse Erwanage vendredi 18 mai 2012 13:14
    vendredi 18 mai 2012 13:14