¿Cómo leer el valor de atributo de XmlNode en C #?

114

Supongamos que tengo un XmlNode y quiero obtener el valor de un atributo llamado "Nombre". ¿Cómo puedo hacer eso?

XmlTextReader reader = new XmlTextReader(path);

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);

foreach (XmlNode chldNode in node.ChildNodes)
{
     **//Read the attribute Name**
     if (chldNode.Name == Employee)
     {                    
         if (chldNode.HasChildNodes)
         {
             foreach (XmlNode item in node.ChildNodes)
             { 

             }
         }
      }
}

Documento XML:

<Root>
    <Employee Name ="TestName">
    <Childs/>
</Root>
Ashish Ashu
fuente

Respuestas:

214

Prueba esto:

string employeeName = chldNode.Attributes["Name"].Value;

Editar: como se señaló en los comentarios, esto generará una excepción si el atributo no existe. La forma segura es:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}
Konamiman
fuente
34
Tenga cuidado con este enfoque. Creo que si el atributo no está presente, acceder al miembro Value provocará una excepción de referencia nula.
Chris Dunaway
3
if (node.Attributes! = null) string employeeName = chldNode.Attributes ["Nombre"]. Valor;
Omidoo
7
@Omidoo Ese enfoque tiene el mismo problema, por ejemplo con <a x="1" />, que pasa la prueba. Quizás algo como var attr = node.Attributes["Name"]; if(attr != null) {...}podría funcionar.
Joel Peltonen
Eche un vistazo a mi respuesta a continuación , que elude el problema NullException y es, tal vez, más seguro de usar.
Marco7757
44

Para expandir la solución de Konamiman (incluidas todas las comprobaciones nulas relevantes), esto es lo que he estado haciendo:

if (node.Attributes != null)
{
   var nameAttribute = node.Attributes["Name"];
   if (nameAttribute != null) 
      return nameAttribute.Value;

   throw new InvalidOperationException("Node 'Name' not found.");
}
Ari Roth
fuente
6
Una forma abreviada de no obtener un error para nulos es node.Attributes? ["Name"] ?. Value
brandonstrong
1
También es cierto, aunque lo único que señalaré es que si bien puedes hacer eso en una línea (lo que lo hace bueno para una tarea o algo así), es un poco menos flexible en términos de controlar cuándo lanzas una excepción o manejas el caso donde el nodo no tiene atributos.
Ari Roth
1
Convenido. Cualquiera que utilice la forma abreviada siempre debe asegurarse de que no cause problemas en el futuro.
brandonstrong
17

puede recorrer todos los atributos como lo hace con los nodos

foreach (XmlNode item in node.ChildNodes)
{ 
    // node stuff...

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}
balexandre
fuente
esto será más preferible .. :)
SHEKHAR SHETE
4

si todo lo que necesita son los nombres, use xpath en su lugar. No es necesario que realice la iteración usted mismo y verifique si es nulo.

string xml = @"
<root>
    <Employee name=""an"" />
    <Employee name=""nobyd"" />
    <Employee/>
</root>
";

var doc = new XmlDocument();

//doc.Load(path);
doc.LoadXml(xml);

var names = doc.SelectNodes("//Employee/@name");
un phu
fuente
Los métodos anteriores no funcionaron para mi XML (aunque desearía que lo hicieran). ¡Este método lo hace! ¡Gracias!
Frecklefoot
4

Si usa chldNodecomo en XmlElementlugar de XmlNode, puede usar

var attributeValue = chldNode.GetAttribute("Name");

El valor de retorno será simplemente una cadena vacía , en caso de que el nombre del atributo no exista.

Entonces su bucle podría verse así:

XmlDocument document = new XmlDocument();
var nodes = document.SelectNodes("//Node/N0de/node");

foreach (XmlElement node in nodes)
{
    var attributeValue = node.GetAttribute("Name");
}

Esto seleccionará todos los nodos <node>rodeados por <Node><N0de></N0de><Node>etiquetas y, posteriormente, los recorrirá y leerá el atributo "Nombre".

Marco7757
fuente
3

Utilizar

item.Attributes["Name"].Value;

para obtener el valor.

rahul
fuente
1

También puedes usar esto;

string employeeName = chldNode.Attributes().ElementAt(0).Name
celda en
fuente
1

Otra solución más:

string s = "??"; // or whatever

if (chldNode.Attributes.Cast<XmlAttribute>()
                       .Select(x => x.Value)
                       .Contains(attributeName))   
   s =  xe.Attributes[attributeName].Value;

También evita la excepción cuando el atributo esperado attributeNamerealmente no existe.

TaW
fuente