2009-10-21 9 views
84

Supposons que j'obtiens un XmlNode et que je veuille attribuer la valeur d'attrbute "Name". Comment puis-je faire ça?Comment lire la valeur d'attribut de XmlNode en C#?

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

      } 
     } 
     } 
} 

XMl Doc:

<Root> 
    <Employee Name ="TestName"> 
    <Childs/> 
</Root> 

Répondre

154

Essayez ceci:

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

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

+2

if (node.Attributes! = Null) chaîne employeeName = chldNode.Attributes ["Nom"]. Valeur; – Omidoo

17

vous pouvez parcourir tous les attributs comme vous le faites avec des noeuds

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

    foreach (XmlAttribute att in item.Attributes) 
    { 
     // attribute stuff 
    } 
} 
+0

ce sera plus préférable .. :) –

3

utilisation

item.Attributes["Name"].Value; 

obtient la valeur

36

Pour développer la solution de Konamiman (y compris tous les chèques nuls pertinents), ce que je fais:

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

    throw new InvalidOperationException("Node 'Name' not found."); 
} 
+2

Une manière sténographique de ne pas obtenir une erreur pour les valeurs nulles est node.Attributes? ["Name"] ?.Valeur – brandonstrong

+1

Également vrai, même si la seule chose que je vais souligner est que, bien que vous puissiez faire cela en une ligne (ce qui est bon pour une tâche ou quelque chose), c'est un peu moins flexible quand vous lancez une exception ou sinon gérer le cas où le noeud n'a aucun attribut. –

+1

D'accord. Quiconque utilise le raccourci doit toujours s'assurer qu'il ne causera pas de problèmes en aval. – brandonstrong

3

si vous avez besoin est le nom, l'utilisation XPath au lieu. Pas besoin de faire vous-même l'itération et de vérifier 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"); 
+0

Les méthodes ci-dessus ne fonctionnaient pas pour mon XML (bien que je souhaite qu'ils avaient). Cette méthode fait! Merci! – Frecklefoot

1

Vous pouvez également utiliser ceci;

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

Si vous utilisez chldNode comme XmlElement au lieu de XmlNode, vous pouvez utiliser

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

Le return value will just be an empty string, dans le cas où le nom d'attribut n'existe pas.

Ainsi, votre boucle pourrait ressembler à ceci:

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

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

Cela permet de sélectionner tous les nœuds <node> entourés par <Node><N0de></N0de><Node> balises et ensuite en boucle à travers eux et lire l'attribut « 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; 

Il évite également l'exception lorsque l'attribut attendu attributeName n'existe pas en réalité.

Questions connexes