Comment lire la valeur d'attribut de XmlNode en C #?

114

Supposons que j'ai un XmlNode et que je souhaite obtenir la valeur d'un attribut nommé "Name". Comment puis je faire ça?

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)
             { 

             }
         }
      }
}

Document XML:

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

Réponses:

214

Essaye ça:

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

Edit: Comme indiqué dans les commentaires, cela lèvera une exception si l'attribut n'existe pas. Le moyen le plus sûr est:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}
Konamiman
la source
34
Soyez prudent avec cette approche. Je pense que si l'attribut n'est pas présent, l'accès au membre Value provoquera une exception de référence nulle.
Chris Dunaway
3
if (node.Attributes! = null) string employeeName = chldNode.Attributes ["Name"]. Value;
Omidoo le
7
@Omidoo Cette approche a le même problème, par exemple avec <a x="1" />, qui réussit le test. Peut-être que quelque chose comme ça var attr = node.Attributes["Name"]; if(attr != null) {...}pourrait fonctionner.
Joel Peltonen
Jetez un œil à ma réponse ci - dessous , qui contourne le problème NullException et est peut-être plus sûr à utiliser.
Marco7757
44

Pour étendre la solution de Konamiman (y compris toutes les vérifications nulles pertinentes), voici ce que j'ai fait:

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

   throw new InvalidOperationException("Node 'Name' not found.");
}
Ari Roth
la source
6
Node.Attributes? ["Name"] ?. Value
brandonstrong
1
Aussi vrai, bien que la seule chose que je souligne, c'est que même si vous pouvez le faire en une seule ligne (ce qui le rend bien pour une affectation ou quelque chose), c'est un peu moins flexible en termes de contrôle lorsque vous lancez une exception ou que vous gérez autrement le cas où le nœud n'a pas d'attribut.
Ari Roth
1
D'accord. Quiconque utilise le raccourci doit toujours s'assurer que cela ne causera pas de problèmes en aval.
brandonstrong
17

vous pouvez parcourir tous les attributs comme vous le faites avec les nœuds

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

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}
balexandre
la source
ce sera plus préférable .. :)
SHEKHAR SHETE
4

si vous n'avez besoin que des noms, utilisez plutôt xpath. Pas besoin de faire l'itération vous-même et de vérifier la valeur null.

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
la source
Les méthodes ci-dessus ne fonctionnaient pas pour mon XML (bien que j'aurais aimé qu'elles le fassent). Cette méthode fait! Merci!
Frecklefoot
4

Si vous utilisez chldNodecomme XmlElementau lieu de XmlNode, vous pouvez utiliser

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

La valeur de retour sera juste une chaîne vide , au cas où le nom d'attribut n'existe pas.

Votre boucle pourrait donc ressembler à ceci:

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

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

Cela sélectionnera tous les nœuds <node>entourés de <Node><N0de></N0de><Node>balises, puis les parcourra en boucle et lira l'attribut "Nom".

Marco7757
la source
3

Utilisation

item.Attributes["Name"].Value;

pour obtenir la valeur.

rahul
la source
1

Vous pouvez également utiliser ceci;

string employeeName = chldNode.Attributes().ElementAt(0).Name
en cellule
la source
1

Encore une autre solution:

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

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

Cela évite également l'exception lorsque l'attribut attendu attributeNamen'existe pas.

TaW
la source