C # 'da XmlNode'dan öznitelik değeri nasıl okunur?


114

Bir XmlNode'um olduğunu ve "Ad" adlı bir özniteliğin değerini almak istediğimi varsayalım. Bunu nasıl yapabilirim?

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

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

Yanıtlar:


214

Bunu dene:

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

Düzenleme: Yorumlarda belirtildiği gibi, öznitelik yoksa bu bir istisna atacaktır. Güvenli yol:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}

34
Bu yaklaşıma dikkat edin. Eğer öznitelik yoksa, Değer üyesine erişmenin Boş Referans İstisnasına neden olacağını düşünüyorum.
Chris Dunaway

3
eğer (düğüm.Özellikler! = boş) string workingName = chldNode.Attributes ["Ad"]. Değer;
Omidoo

7
@Omidoo Bu yaklaşım, örneğin <a x="1" />testi geçen ile aynı sorunu yaşıyor . Belki böyle bir şey var attr = node.Attributes["Name"]; if(attr != null) {...}işe yarayabilir.
Joel Peltonen

NullException sorununu aşan ve belki de daha güvenli olan aşağıdaki cevabıma bir göz atın .
Marco7757

44

Konamiman'ın çözümünü genişletmek için (ilgili tüm boş kontroller dahil), yaptığım şey buydu:

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

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

6
Boş değerler için hata almamanın kısa bir yolu node.Özellikler? ["Ad"]? Değer
brandonstrong

1
Ayrıca doğru, yine de işaret edeceğim tek şey, bunu tek bir satırda yapabilseniz de (bir ödev veya başka bir şey için iyi hale getirirken), bir istisna attığınızda veya başka bir şekilde ele aldığınızda kontrol etme açısından biraz daha az esnek düğümün özniteliği olmadığı durum.
Ari Roth

1
Kabul. Kısaltma yolunu kullanan herkes, her zaman aşağı akışta sorun yaratmayacağından emin olmalıdır.
brandonstrong

17

düğümlerde yaptığınız gibi tüm özniteliklerde döngü yapabilirsiniz

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

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

bu daha çok tercih edilir .. :)
SHEKHAR SHETE

4

tek ihtiyacınız olan isimlerse, bunun yerine xpath kullanın. Yinelemeyi kendiniz yapmanıza ve boş değeri kontrol etmenize gerek yok.

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

Yukarıdaki yöntemler XML'im için işe yaramadı (keşke olsa da). Bu yöntem yapar! Teşekkürler!
Frecklefoot

4

Eğer kullanırsanız chldNodeolarak XmlElementyerine XmlNodekullanabileceğiniz

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

Dönüş değeri sadece boş dize olacaktır özellik adı yok durumda.

Böylece döngünüz şöyle görünebilir:

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

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

Bu, etiketlerle <node>çevrili tüm düğümleri seçecek <Node><N0de></N0de><Node>ve daha sonra aralarında döngü oluşturacak ve "Ad" niteliğini okuyacaktır.


3

kullanım

item.Attributes["Name"].Value;

değeri almak için.


1

Bunu da kullanabilirsiniz;

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

1

Yine başka bir çözüm:

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

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

Ayrıca, beklenen öznitelik attributeNamegerçekte mevcut olmadığında istisnayı da önler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.