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>
Ashish Ashu
sumber

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
}
Konamiman
sumber
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.");
}
Ari Roth
sumber
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
    }
}
balexandre
sumber
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");
sebuah phu
sumber
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".

Marco7757
sumber
3

Menggunakan

item.Attributes["Name"].Value;

untuk mendapatkan nilainya.

rahul
sumber
1

Anda juga bisa menggunakan ini;

string employeeName = chldNode.Attributes().ElementAt(0).Name
sel-dalam
sumber
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.

TaW
sumber