Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    Consultant freelance, n'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Requête XPath et namespace XML par défaut

Les requêtes XPath permettent de faire du requetage sur un fichier XML afin de trouver facilement et rapidement un ou plusieurs noeuds XML.

En .net, on peut faire une requête XPath à partir d'un objet XmlNode via les méthodes SelectSingleNode ainsi que SelecNodes.

Par exemple si on a ce fichier XML :

<?xml version="1.0" encoding="utf-8" ?> <Pouets> <Pouet>Pouet N°1</Pouet> </Pouets>

On peut obtenri le premier noeud Pouet ainsi :

XmlDocument doc = new XmlDocument(); doc.Load("pouet.xml"); Console.WriteLine(doc.SelectSingleNode("//Pouet") != null);

(Bien sur XPath est beaucoup plus puissant que ça, mais ce n'est pas l'objet du post.)

Malheureusement ça se gate si on travail avec des fichiers XML complexes : avec plusieurs namespaces XML. Par exemple si on a ce fichier :

<?xml version="1.0" encoding="utf-8" ?> <Pouets xmlns="pouetNamespace"> <Pouet>Pouet N°1</Pouet> </Pouets>

Le code plus haut ne fonctionne plus ! Après un tour dans la documentation, on peut utiliser un XmlNamespaceManager afin de résoudre les namespaces XML.

On pourrait alors écrire :

XmlDocument doc = new XmlDocument(); doc.Load("pouet.xml"); XmlNamespaceManager xmlnsmgr = new XmlNamespaceManager(doc.NameTable); xmlnsmgr.AddNamespace(String.Empty, "pouetNamespace"); Console.WriteLine(doc.SelectSingleNode("//Pouet", xmlnsmgr) != null); // => doesn't work !

Mais cela ne fonctionne toujours pas. En lisant d'avantages la doc, il y a une partie sur les requêtes XPath et namespaces par défaut.

If the XPath expression does not include a prefix, it is assumed that the namespace URI is the empty namespace. If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceManager; otherwise, you will not get a node selected. For more information, see Select Nodes Using XPath Navigation.

Pour requêter un fichier XML ayant un namespace par défaut, on est donc obligé de rajouter un namespace avec un prefixe, ce qui donne :

XmlDocument doc = new XmlDocument(); doc.Load("pouet.xml"); XmlNamespaceManager xmlnsmgr = new XmlNamespaceManager(doc.NameTable); xmlnsmgr.AddNamespace("dummy", "pouetNamespace"); Console.WriteLine(doc.SelectSingleNode("//dummy:Pouet", xmlnsmgr) != null);

Je trouve ce comportement étonnant et absolument pas intuitif. De plus, l'impossibilité de récupérer un XmlNamespaceManager à partir d'un XmlDocument rend l'utilisation de XPath via .net sur des fichiers XML complexe très pénible. Je ne parle même pas de l'utilisation de XPath via XLinq (Linq to XML), qui est complètement impossible sauf en passant par un XmlReader ou le contenu littéral du XML.

Posted: lundi 7 juillet 2008 22:14 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

neodante a dit :

La prochaine fois que tu as un soucis demande un a un MVP XML ... ;-) Prochainement un poste avec cela pour Linq to XML. Ca devrait t'intéresser. Toujours en préparation depuis des semaines, juste trouver le temps de le terminer ...

# juillet 7, 2008 23:24
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 11 heures et 6 minutes

- Certifications beta .NET 4 par Kévin Gosse le il y a 11 heures et 12 minutes

- [Mix 2010] – Microsoft Translator Technology Preview V2 par RedoBlog - The .NET Gentleman !!! le il y a 11 heures et 53 minutes

- Lancement en Preview de Cyclone lors des TechDays 2010! par Blog de Frédéric Queudret le il y a 14 heures et 16 minutes

- [WP7] Je ne veux pas d’un nouvel iPhone par Le blog de FremyCompany le il y a 17 heures et 35 minutes

- [WF4] Pourquoi utiliser le ContentPresenter dans l’ActivityDesigner? par Blog de Jérémy Jeanson le il y a 22 heures et 52 minutes

- [Mix 2010] – Telechargez Internet Explorer 9 en Preview ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:58

- [MIX 2010] – Keynote Day 2 online : Windows Internet Explorer 9, jQuery, OData et Dallas CTP2 ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:18

- [Mix 2010] – Retour d’expérience développement Seesmic sur Windows Phone 7 par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:44

- [Mix 2010] – Le Keynote Day 1 disponible online ! par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:21