2009-10-21 10 views
84

Załóżmy, że otrzymałem XmlNode i chcę przypisać wartość attirbute "Name". Jak mogę to zrobić?Jak odczytać wartość atrybutu z XmlNode w 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> 

Odpowiedz

154

Spróbuj tego:

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

Należy zachować ostrożność przy takim podejściu. Myślę, że jeśli atrybut nie jest obecny, dostęp do elementu wartości spowoduje wyjątek odwołania zerowego. –

+2

if (node.Attributes! = Null) string employeeName = chldNode.Attributes ["Name"]. Wartość; – Omidoo

17

można pętli wszystkich atrybutów, jak zrobić z węzłami

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

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

będzie to bardziej preferowane .. :) –

3

Zastosowanie

item.Attributes["Name"].Value; 

Pobiera wartość

36

Aby rozwinąć rozwiązanie Konamiman (łącznie z wszystkimi odpowiednimi kontrolami null), to co robiłem:

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

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

Skrócony sposób nie otrzymania błędu dla wartości null to node.Attributes? ["Name"] ?.Wartość – brandonstrong

+1

To prawda, chociaż zwracam uwagę tylko na to, że podczas gdy można to zrobić w jednym wierszu (czyniąc go dobrym dla zadania lub czegoś), jest to trochę mniej elastyczne pod względem sterowania, kiedy rzuca się wyjątek lub w przeciwnym razie zajmij się przypadkiem, w którym węzeł nie ma atrybutów. –

+1

Uzgodnione. Każdy, kto korzysta ze skróconego sposobu, powinien zawsze upewnić się, że nie spowoduje problemów w dolnym biegu. – brandonstrong

3

jeśli wszystko czego potrzebujesz to nazwy, korzystanie XPath zamiast. Nie musisz wykonywać iteracji samodzielnie i sprawdzać wartość zerową.

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

Powyższe metody nie działały dla mojego XML (chociaż szkoda, że ​​nie miały). Ta metoda ma! Dzięki! – Frecklefoot

1

Możesz również użyć tego;

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

Jeśli używasz chldNode jako XmlElement zamiast XmlNode, można użyć

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

return value will just be an empty string, w przypadku gdy nazwa atrybutu nie istnieje.

Więc pętla mogłaby wyglądać następująco:

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

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

Spowoduje to zaznaczenie wszystkich węzłów <node> otoczonych <Node><N0de></N0de><Node> tagi i następnie w pętli przez nich i odczytać atrybut „name”.

1

Jeszcze innym rozwiązaniem:

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

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

unika też wyjątek, gdy spodziewane atrybut attributeName faktycznie nie istnieje.

Powiązane problemy