Leer un fichero XML con las clases del namespace System.Xml.Xpath
Artículo por Club Developers · 28 agosto 2006
2268 vistas
Veamos un ejemplo básico de lectura de un fichero XML, pero sin servirse de la clase XmlDocument, sino de las clases del namespace System.Xml.Xpath. Podemos diferenciar dos casos, los fichero XML base y los que tienen un namespace.
1.- Fichero XML básico
Su implementación:
2.- Fichero XML con un namespace
Su implementación:
Nota:
y
no representan la misma cosa
1.- Fichero XML básico
xml
<Recordbook> <Records> <Record> <FirstValue>10</FirstValue> <SecondValue>51</SecondValue> </Record> <Record> <FirstValue>25</FirstValue> <SecondValue>38</SecondValue> </Record> </Records> </Recordbook>
Su implementación:
csharp
using System.Xml.XPath; ... private void TraiteXml() { XPathNavigator nav = doc.CreateNavigator(); // recuperamos un XPathNodeIterator XPathNodeIterator iter = nav.Select("Recordbook/Records/Record"); // Para cada Record while (iter.MoveNext()) { // recuperamos la info FirstValue string firstValue=iter.Current.SelectSingleNode("FirstValue").Value; // recuperamos la info SecondValue string secondValue = iter.Current.SelectSingleNode ("SecondValue").Value; } }
2.- Fichero XML con un namespace
xml
<rd:Recordbook xmlns:rd="http://myexemple/myschema/record"> <rd:Records> <rd:Record> <rd:FirstValue>10</rd:FirstValue> <rd:SecondValue>51</rd:SecondValue> </rd:Record> <rd:Record> <rd:FirstValue>25</rd:FirstValue> <rd:SecondValue>38</rd:SecondValue> </rd:Record> </rd:Records> </rd:Recordbook>
Su implementación:
csharp
using System.Xml; using System.Xml.XPath; //... private void TraiteXml() { XPathNavigator nav = doc.CreateNavigator(); // gestión de los spacenames XmlNamespaceManager mgr = new XmlNamespaceManager (nav.NameTable); mgr.AddNamespace("rd", http://myexemple/myschema/record); // recuperamos un XPathNodeIterator XPathNodeIterator iter = nav.Select ("rd:Recordbook/rd:Records/rd:Record", mgr); // para cada Record while (iter.MoveNext()) { // recuperamos la info FirstValue string firstValue = iter.Current.SelectSingleNode("rd:FirstValue", mgr).Value; // recuperamos la info SecondValue string secondValue = iter.Current.SelectSingleNode ("rd:SecondValue", mgr).Value; } }
Nota:
csharp
nav.Select("Recordbook/Records/Record");
y
csharp
nav.Select("Recordbook/Records/record");
no representan la misma cosa