Bagaimana membaca nilai atribut dari XmlNode di C #?


114

Misalkan saya memiliki XmlNode dan saya ingin mendapatkan nilai atribut bernama "Name". Bagaimana saya bisa melakukan itu?

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

             }
         }
      }
}

Dokumen XML:

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

Jawaban:


214

Coba ini:

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

Edit: Seperti yang ditunjukkan di komentar, ini akan memunculkan pengecualian jika atribut tidak ada. Cara yang aman adalah:

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

34
Hati-hati dengan pendekatan ini. Saya pikir jika atribut tidak ada, maka mengakses anggota Value akan menyebabkan Pengecualian Referensi Null.
Chris Dunaway

3
jika (node.Attributes! = null) string employeeName = chldNode.Attributes ["Nama"] Nilai;
Omidoo

7
@Omidoo Pendekatan tersebut memiliki masalah yang sama, misalnya dengan <a x="1" />, yang lulus ujian. Mungkin sesuatu seperti itu var attr = node.Attributes["Name"]; if(attr != null) {...}mungkin berhasil.
Joel Peltonen

Lihatlah jawaban saya di bawah ini , yang menghindari masalah NullException dan, mungkin ?, lebih aman digunakan.
Marco7757

44

Untuk memperluas solusi Konamiman (termasuk semua pemeriksaan null yang relevan), inilah yang telah saya lakukan:

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

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

6
Cara singkat untuk tidak mendapatkan kesalahan untuk null adalah node.Attributes? ["Name"] ?. Value
brandonstrong

1
Juga benar, meskipun satu-satunya hal yang akan saya tunjukkan adalah bahwa sementara Anda dapat melakukannya dalam satu baris (membuatnya baik untuk tugas atau sesuatu), itu sedikit kurang fleksibel dalam hal pengendalian ketika Anda mengeluarkan pengecualian atau menangani kasus dimana node tidak memiliki atribut.
Ari Roth

1
Sepakat. Siapapun yang menggunakan cara singkat harus selalu memastikan itu tidak akan menimbulkan masalah di hilir.
brandonstrong

17

Anda dapat melakukan loop melalui semua atribut seperti yang Anda lakukan dengan node

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

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

ini akan lebih disukai .. :)
SHEKHAR SHETE

4

jika yang Anda butuhkan hanyalah nama, gunakan xpath sebagai gantinya. Tidak perlu melakukan iterasi sendiri dan memeriksa 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");

Metode di atas tidak berfungsi untuk XML saya (meskipun saya berharap mereka memilikinya). Metode ini berhasil! Terima kasih!
Frecklefoot

4

Jika Anda menggunakan chldNodesebagai XmlElementpengganti XmlNode, Anda dapat menggunakan

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

Nilai yang dikembalikan hanya berupa string kosong , jika nama atribut tidak ada.

Jadi loop Anda akan terlihat seperti ini:

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

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

Ini akan memilih semua node yang <node>dikelilingi oleh <Node><N0de></N0de><Node>tag dan kemudian mengulanginya dan membaca atribut "Name".


3

Menggunakan

item.Attributes["Name"].Value;

untuk mendapatkan nilainya.


1

Anda juga bisa menggunakan ini;

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

1

Solusi lain:

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

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

Ini juga menghindari pengecualian ketika atribut yang diharapkan attributeNamesebenarnya tidak ada.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.