Meilleur auteur de réponses
Comment charger et requeter un XML complexe avec Xpath dans un DetailsView?

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
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:
- Faire la feuille de style XSL dans un fichier dédié et la référencer dans la XMLDataSource via la propriété TransformFile
- 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
-
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
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".
- Proposé comme réponse Ciprian Duduiala jeudi 17 mai 2012 06:47
-
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:
- Faire la feuille de style XSL dans un fichier dédié et la référencer dans la XMLDataSource via la propriété TransformFile
- 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
-
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
-
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".
-
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?
-
-
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. -
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?
-
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