Leer atributo de nodo xml
Frecuentes
Visto 44,590 veces
5
Tengo un documento xml que tiene nodos como este, <ITEM id="1" name="bleh"... />
Lo que quiero hacer es obtener todos los valores de atributo de identificación para cada nodo ITEM que existe en el documento.
Entonces, ¿cómo puedo hacer eso?
Editar: lo he intentado de esta manera y no funciona:
XmlDocument Doc = new XmlDocument();
Doc.Load("example.xml");
XmlNodeList nodeList = Doc.SelectNodes("/ITEM");
foreach (XmlNode node in nodeList)
{
string id = node.Attributes["id"].Value;
Console.WriteLine(id);
}
1 Respuestas
18
Deberías usar Administrador de espacio de nombres Xml en tu llamada a SelectSingleNode () ya que su XML contiene un espacio de nombres en él:
var doc = new XmlDocument();
doc.Load("example.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("anyname", "http://tempuri.org/zitem.xsd");
foreach (XmlNode node in doc.SelectNodes("//anyname:ITEM", ns))
{
Console.WriteLine(node.Attributes["id"].Value);
}
Por eso no obtienes ningún resultado.
La diferencia entre mi código y el tuyo es que yo estoy usando //
entonces, en lugar de comenzar en la raíz de un documento, una barra inclinada doble //
indica a un XPath
evaluador para buscar en cualquier parte de un documento XML.
Aquí está mi example.xml
como muestra:
<root>
<items>
<ITEM id="1" name="bleh=" />
<ITEM id="2" name="bleh=" />
<ITEM id="3" name="bleh=" />
<ITEM id="4" name="bleh=" />
<ITEM id="5" name="bleh=" />
<ITEM id="6" name="bleh=" />
<ITEM id="7" name="bleh=" />
<ITEM id="8" name="bleh=" />
</items>
</root>
Y así es como lo estoy leyendo:
var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode node in doc.SelectNodes("//ITEM[@id]"))
{
Console.WriteLine(node.Attributes["id"].Value);
}
Con una sola barra, lo anterior XPath
se vería así:
/root/items/ITEM
También estoy usando [@id]
para asegurar que el ITEM
elemento tiene un ID
atributo pero eso no es necesario si sabes que todos tienen un ID
atributo.
Respondido el 16 de Septiembre de 13 a las 02:09
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# xml visual-studio-2012 or haz tu propia pregunta.
Su forma funciona, pero el problema es que está cargando la estructura xml desde el código y no desde un archivo. - Derezzed
@Derezzed eso no importa, también puede cargarlo desde un archivo, siempre que el archivo esté bien formateado y un XML válido, debería funcionar igual. Como no sé cómo está tu archivo, hice mi propio ejemplo para mostrártelo. - Precio
Perdón por no dar la estructura del archivo, el archivo es así, pastebin.com/raw.php?i=TjHYW5TP - Derezzed
@Derezzed aha eso es porque tiene un espacio de nombres, vea la actualización en el código en la parte superior. - Precio
Funciona, pero hay algo extraño, no está imprimiendo desde la identificación "0", solo imprime algunas de las identificaciones pero no todas. De todos modos, muchas gracias por ayudarme. - Derezzed