A la suite des articles de Derf sur l’XML et l’objet DOM, je vais essayer de vous présenter une alternative particulièrement intéressante pour parser du XML en .Net via l’espace de nom System.Xml.Xpath et l’objet XpathNavigator.
L’objectif de ce tutorial n’est pas de décrire avec précision l’espace de nom. Le site MSDN et le Kit de ressource contiennent un aperçu complet et précis de chaque membre ou interface de celui ci. Nous allons plutôt nous focaliser sur son implémentation et ses divers avantages / inconvénients face à l’objet roi du XML dans le Framework.Net : le Dom XML.
L’espace de nom « System.Xml.Xpath » via son objet « XpathNavigator » permet une analyse plus rapide des flux XML que le Dom classique. Il est cependant moins véloce que le system.Xml.XmlTextReader et bien moins riche que le Dom XML, mais il possède suffisamment de fonctionnalités pour être l’outil idéal dans l’analyse de structure XML assez complexe selon autant d’axe de consultation nécessaire.
En pratique, la classe « XpathNavigator » est surtout appropriée dans les opérations de lecture exigeant un minimum de flexibilité mais sans nécessité de modification. Actuellement, les classes Xpath ne sont dédiées qu’à la lecture seule de données XML basé sur des requêtes Xpath ascendante ou descendante, ils ne permettent pas l’ajout ou la modification de données.
Mais les classes Xpath sont bien plus performantes que le DOM dans les opérations de lecture directe ou à position aléatoire. L’objet « XmlTextReader », lui ne permet que de lecture en avant seulement, et n’utilise pas de système de requête mais plus un principe de pointeur de lecteur à l’instar d’un magnétoscope ou un lecteur DVD mais bloqué en marche avant.
Pour aller un peu plus loin, on est souvent tenté de comparer la méthode SelectNodes du Dom XML et la méthode Select du « XpathNavigator ». Les deux méthodes utilisent bien des requêtes Xpath et ceci, dans le même but. Par contre, si vous dé compilez la méthode du Dom, vous observerez que le code interne implémente en fait un objet XPATH en interne
public XmlNodeList SelectNodes(string xpath){ XPathNavigator navigator1; navigator1 = this.CreateNavigator(); return new XPathNodeList(navigator1.Select(xpath)); }
>>> Il est donc bien plus intéressant d’utiliser son propre objet « XpathNavigator » et de le réutiliser