Leer atributo de nodo xml

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);
        }

preguntado el 16 de septiembre de 13 a las 00:09

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.