Leyendo valores de atributos con XmlReader

Tengo un archivo XML que bash leer desde aquí y tengo el siguiente código:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.IO; namespace XML { class Program { static void Main(string[] args) { XmlTextReader textReader = new XmlTextReader("secLendingXML.cfm.xml"); while (textReader.Read()) { switch (textReader.NodeType) { case XmlNodeType.Element: Console.WriteLine(textReader.Name); Console.WriteLine(textReader.Value); break; case XmlNodeType.Text: Console.WriteLine(textReader.Value); break; case XmlNodeType.XmlDeclaration: case XmlNodeType.ProcessingInstruction: Console.WriteLine(textReader.Name + " " + textReader.Value); break; case XmlNodeType.Comment: Console.WriteLine(textReader.Value); break; case XmlNodeType.EndElement: break; } } Console.ReadLine(); } } } 

El código funciona correctamente en el sentido de que está leyendo los nodos y devolviendo los nombres. Pero, el problema es que también estoy intentando recuperar los datos dentro de los nodos. En otras palabras, cuando lea la primera sección después de la sección de prueba, leerá:

 slnc:DataSet slnc:Group slnc:Section slnc:ActualAvailableToBorrow *** here *** slnc:oustandingLoans 

Aquí es donde quiero que el lector de texto lea los siguientes valores dentro del nodo como confidentiality="F" , currency="USD" , etc., ¡pero solo pasa directamente a la siguiente sección sin leer estos valores!

  

¿Cómo consigo que el lector de texto lea los valores de los atributos? Sería ideal que imprima el valor “moneda”, y luego su valor: “F”, y así sucesivamente.

Obtenga un atributo único con nombre

Use XmlTextReader.GetAttribute (MSDN)

 case XmlNodeType.Element: Console.WriteLine(textReader.Name); Console.WriteLine(textReader.Value); Console.WriteLine(textReader.GetAttribute("currency")); 

Una buena característica de esta función: no causará una excepción si el atributo no está definido, simplemente devolverá Null .

Consigue todos los atributos

Use XmlTextReader.MoveToAttribute (MSDN)

Use la propiedad AttributeCount en combinación con MoveToAttribute:

 case XmlNodeType.Element: Console.WriteLine(textReader.Name); Console.WriteLine(textReader.Value); for (int attInd = 0; attInd < textReader.AttributeCount; attInd++){ textReader.MoveToAttribute( attInd ); Console.WriteLine(textReader.Name); Console.WriteLine(textReader.Value); } textReader.MoveToElement(); 

Podría cambiar un poco la condición del bucle para que también se itere a través de los atributos:

 while (textReader.MoveToNextAttribute() || textReader.Read()) { case XmlNodeType.Element: Console.WriteLine(textReader.Name); Console.WriteLine(textReader.Value); break; //... case XmlNodeType.Attribute: //use textReader.Name and textReader.Value here for attribute name and value break; } 

MoveToNextAttribute método MoveToNextAttribute avanza el lector al siguiente atributo en el elemento actual o devuelve false si no puede hacerlo.