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>

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
}

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

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

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

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


3

Utilisation

item.Attributes["Name"].Value;

pour obtenir la valeur.


1

Vous pouvez également utiliser ceci;

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.