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