Wie lese ich den Attributwert aus XmlNode in C #?

114

Angenommen, ich habe einen XmlNode und möchte den Wert eines Attributs mit dem Namen "Name" abrufen. Wie kann ich das machen?

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-Dokument:

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

Antworten:

212

Versuche dies:

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

Bearbeiten: Wie in den Kommentaren erwähnt, wird eine Ausnahme ausgelöst, wenn das Attribut nicht vorhanden ist. Der sichere Weg ist:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}
Konamiman
quelle
34
Seien Sie vorsichtig mit diesem Ansatz. Ich denke, wenn das Attribut nicht vorhanden ist, führt der Zugriff auf das Value-Mitglied zu einer Nullreferenzausnahme.
Chris Dunaway
3
if (node.Attributes! = null) string employeeName = chldNode.Attributes ["Name"]. Value;
Omidoo
7
@Omidoo Dieser Ansatz hat das gleiche Problem, zum Beispiel mit <a x="1" />, das den Test besteht. Vielleicht var attr = node.Attributes["Name"]; if(attr != null) {...}könnte so etwas funktionieren.
Joel Peltonen
Schauen Sie sich meine Antwort unten an , die das NullException-Problem umgeht und möglicherweise sicherer zu verwenden ist.
Marco7757
44

Um die Konamiman-Lösung (einschließlich aller relevanten Nullprüfungen) zu erweitern, habe ich Folgendes getan:

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

   throw new InvalidOperationException("Node 'Name' not found.");
}
Ari Roth
quelle
6
Eine Abkürzung, um keinen Fehler für Nullen zu erhalten, ist node.Attributes? ["Name"]?. Value
brandonstrong
1
Auch wahr, obwohl das einzige, worauf ich hinweisen möchte, ist, dass Sie dies zwar in einer Zeile tun können (was es gut für eine Aufgabe oder etwas anderes macht), aber etwas weniger flexibel in Bezug auf die Steuerung, wenn Sie eine Ausnahme auslösen oder auf andere Weise behandeln der Fall, in dem der Knoten keine Attribute hat.
Ari Roth
1
Einverstanden. Jeder, der die Kurzform verwendet, sollte immer sicherstellen, dass es keine Probleme stromabwärts verursacht.
Brandonstrong
17

Sie können alle Attribute wie bei Knoten durchlaufen

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

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}
Balexandre
quelle
Dies wird vorzuziehen sein .. :)
SHEKHAR SHETE
4

Wenn Sie nur die Namen benötigen, verwenden Sie stattdessen xpath. Sie müssen die Iteration nicht selbst durchführen und nach null suchen.

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");
ein phu
quelle
Die oben genannten Methoden funktionierten für mein XML nicht (obwohl ich wünschte, sie hätten es getan). Diese Methode macht! Vielen Dank!
Frecklefoot
4

Wenn Sie chldNodeals XmlElementanstelle von verwenden XmlNode, können Sie verwenden

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

Der Rückgabewert ist nur eine leere Zeichenfolge , falls der Attributname nicht vorhanden ist.

Ihre Schleife könnte also so 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 <node>von <Node><N0de></N0de><Node>Tags umgebenen Knoten ausgewählt und anschließend durchlaufen und das Attribut "Name" gelesen.

Marco7757
quelle
3

Verwenden

item.Attributes["Name"].Value;

um den Wert zu erhalten.

rahul
quelle
1

Sie können dies auch verwenden;

string employeeName = chldNode.Attributes().ElementAt(0).Name
cell-in
quelle
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;

Außerdem wird die Ausnahme vermieden, wenn das erwartete Attribut attributeNametatsächlich nicht vorhanden ist.

TaW
quelle