Làm cách nào để đọc giá trị thuộc tính từ XmlNode trong C #?


114

Giả sử tôi có một XmlNode và tôi muốn lấy giá trị của một thuộc tính có tên là "Tên". Làm thế nào tôi có thể làm điều đó?

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

             }
         }
      }
}

Tài liệu XML:

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

Câu trả lời:


214

Thử cái này:

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

Chỉnh sửa: Như đã chỉ ra trong các nhận xét, điều này sẽ ném ra một ngoại lệ nếu thuộc tính không tồn tại. Cách an toàn là:

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

34
Hãy cẩn thận với cách tiếp cận này. Tôi nghĩ nếu thuộc tính không có, thì việc truy cập thành viên Giá trị sẽ gây ra Ngoại lệ Tham chiếu Null.
Chris Dunaway 21/10/09

3
if (node.Attributes! = null) string characterName = chldNode.Attributes ["Name"]. value;
Omidoo

7
@Omidoo Cách tiếp cận đó có cùng một vấn đề, chẳng hạn như cách <a x="1" />nào vượt qua bài kiểm tra. Có lẽ một cái gì đó giống như var attr = node.Attributes["Name"]; if(attr != null) {...}có thể hoạt động.
Joel Peltonen

Hãy xem câu trả lời của tôi bên dưới , câu trả lời nào đã giải quyết được vấn đề NullException và, có thể ?, sử dụng an toàn hơn.
Marco7757

44

Để mở rộng giải pháp của Konamiman (bao gồm tất cả các kiểm tra rỗng có liên quan), đây là những gì tôi đang làm:

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

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

6
Một cách viết tắt để không gặp lỗi cho null là node.Attributes? ["Name"]?. Value
brandonstrong

1
Cũng đúng, mặc dù điều duy nhất tôi sẽ chỉ ra là mặc dù bạn có thể làm điều đó trong một dòng (làm cho nó tốt cho một nhiệm vụ hoặc điều gì đó), nó hơi kém linh hoạt hơn về mặt kiểm soát khi bạn ném một ngoại lệ hoặc xử lý theo cách khác trường hợp nút không có thuộc tính.
Ari Roth

1
Đã đồng ý. Bất kỳ ai sử dụng cách viết tốc ký phải luôn đảm bảo rằng nó sẽ không gây ra các vấn đề ở phần hạ lưu.
brandonstrong

17

bạn có thể lặp lại tất cả các thuộc tính giống như bạn làm với các nút

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

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

cái này sẽ thích hơn .. :)
SHEKHAR SHETE

4

nếu tất cả những gì bạn cần là tên, hãy sử dụng xpath để thay thế. Không cần phải tự mình lặp lại và kiểm tra 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");

Các phương pháp trên không hoạt động với XML của tôi (mặc dù tôi ước gì chúng có). Phương pháp này không! Cảm ơn!
Frecklefoot

4

Nếu bạn sử dụng chldNodenhư XmlElementthay vì XmlNode, bạn có thể sử dụng

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

Các giá trị trả về sẽ chỉ là một chuỗi rỗng , trong trường hợp tên thuộc tính không tồn tại.

Vì vậy, vòng lặp của bạn có thể trông như thế này:

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

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

Thao tác này sẽ chọn tất cả các nút được <node>bao quanh bởi <Node><N0de></N0de><Node>các thẻ và sau đó lặp qua chúng và đọc thuộc tính "Tên".


3

Sử dụng

item.Attributes["Name"].Value;

để nhận giá trị.


1

Bạn cũng có thể sử dụng cái này;

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

1

Tuy nhiên, một giải pháp khác:

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

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

Nó cũng tránh ngoại lệ khi thuộc tính mong đợi attributeNamethực sự không tồn tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.