¿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>

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
}

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

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

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

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".


3

Utilizar

item.Attributes["Name"].Value;

para obtener el valor.


1

También puedes usar esto;

string employeeName = chldNode.Attributes().ElementAt(0).Name

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.