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

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 12 heures et 36 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 13 heures et 50 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18