2009-10-21 14 views
84

Angenommen, ich bekomme einen XmlNode und möchte den Wert von attirbute "Name" zuweisen. Wie kann ich das tun ??Wie kann ich den Attributwert von XmlNode in C# lesen?

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> 

Antwort

154

Try this:

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

Seien Sie vorsichtig mit diesem Ansatz. Ich denke, wenn das Attribut nicht vorhanden ist, verursacht das Zugreifen auf das Wertelement eine Nullreferenzausnahme. –

+2

if (node.Attributes! = Null) string mitarbeiterName = chldNode.Attributes ["Name"]. Value; – Omidoo

17

Sie Schleife durch alle Attribute können wie man mit Knoten

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

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

wird dies mehr vorzuziehen .. :) –

3

Verwenden

Zur Erweiterung Konamiman-Lösung (einschließlich aller relevanten null Kontrollen), das ist, was ich getan habe
item.Attributes["Name"].Value; 

den Wert

36

bekommt:

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

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

Eine Kurzform, um keinen Fehler für Nullen zu bekommen, ist node.Attributes? ["Name"] ?.Wert – brandonstrong

+1

Auch wahr, obwohl das einzige, was ich darauf hinweisen werde, ist, dass, während Sie das in einer Zeile tun können (was es für eine Aufgabe oder etwas gut macht), ist es etwas weniger flexibel in Bezug auf die Kontrolle, wenn Sie eine Ausnahme werfen oder Behandeln Sie andernfalls den Fall, in dem der Knoten keine Attribute hat. –

+1

Einverstanden. Wer die Kurzschrift verwendet, sollte immer sicherstellen, dass es stromabwärts keine Probleme verursacht. – brandonstrong

3

, wenn alles, was Sie brauchen die Namen ist, die Verwendung von XPath stattdessen. Sie müssen die Iteration nicht selbst durchführen und auf Null prüfen.

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

Die obigen Methoden funktionierten nicht für mein XML (obwohl ich wünschte, sie hätten). Diese Methode funktioniert! Vielen Dank! – Frecklefoot

1

Sie können dies auch verwenden;

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

Wenn Sie chldNode als XmlElement statt XmlNode, können Sie

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

Die return value will just be an empty string, verwenden, falls der Attributname existiert nicht.

So könnte Ihre Schleife wie folgt aussehen:

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

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

Dadurch werden alle Knoten wählen <node> von <Node><N0de></N0de><Node> Tags umgeben und anschließend durch sie Schleife und lesen Sie das Attribut „Name“.

1

Noch eine andere Lösung:

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

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

Es vermeidet auch die Ausnahme, wenn die erwartete Attribut attributeName tatsächlich nicht existiert.

Verwandte Themen