2010-09-20 87 views
9

Giả sử tôi có Tài liệu XML sau.Lấy giá trị thuộc tính của Tài liệu XML bằng C#

<reply success="true">More nodes go here</reply> 

Cách lấy giá trị của thuộc tính thành công, trong trường hợp này sẽ là chuỗi "true".

+0

Phải sử dụng soluton 'XmlDocument' hoặc bất kỳ API xử lý XML specifc nào khác không? –

+0

@Daniel: trước khi bạn đến đó: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 ;-) –

+0

@Isak: Tôi không có ý định đi tuyến đường RegEx! Câu hỏi về "Tài liệu XML" đề xuất sử dụng API DOM (nghĩa là 'XmlDocument') nhưng tôi đã hỏi liệu điều đó có được yêu cầu hay không hoặc liệu API dựa trên luồng/SAX như' XmlReader' có được chấp nhận hay không. –

Trả lời

22

tôi sẽ cố gắng một cái gì đó như thế này:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<reply success=\"true\">More nodes go here</reply>"); 

XmlElement root = doc.DocumentElement; 

string s = root.Attributes["success"].Value; 
+0

Bạn cũng có thể thử lấy thuộc tính theo tên: root.Attributes ["succes"] Giá trị –

+1

Thực tế là rất xấu để truy cập các thuộc tính theo vị trí, bởi vì theo định nghĩa, thứ tự các thuộc tính trên các phần tử XML không đáng kể. Trong trường hợp tầm thường này, nó hoạt động vì chỉ có một thuộc tính, nhưng đó chỉ là may mắn. –

+0

Bạn nói đúng, tôi đã đề xuất giải pháp thay thế trong nhận xét đầu tiên của tôi. Bây giờ tôi đã chỉnh sửa bài viết gốc của mình để hiển thị nó. –

-1

Dưới đây là một giải pháp thay thế sử dụng XmlReader mà có thể nhiều hơn một chút hiệu quả hơn sử dụng XmlDoument mặc dù đó là proably không đáng kể trên một tài liệu XML nhỏ như vậy

string input = "<reply success=\"true\">More nodes go here</reply>"; 

using (XmlReader xmlReader = XmlReader.Create(new StringReader(input))) 
{ 
    xmlReader.MoveToContent(); 
    string success = xmlReader.GetAttribute("success"); 
    Console.WriteLine(success); 
} 
+1

Chà, ba câu trả lời liên tiếp tất cả đều làm cùng một điều sai trái theo ba cách khác nhau. –

+0

Tôi nghĩ ấn tượng chung mà câu hỏi ban đầu đưa ra là chúng ta phải tìm giá trị cho thuộc tính đầu tiên. Bây giờ tôi đã sửa mã của tôi để làm điều hữu ích hơn mà bạn đề xuất. – explorer

+0

@ Robert: đủ công bằng, câu trả lời đã thay đổi –

2
using System; 
    using System.Linq; 
    using System.Xml.Linq; 

    class MyClass 
    { 
     static void Main(string[] args) 
     { 
      XElement xmlcode = 
      XElement.Parse("<reply success=\"true\">More nodes go </reply>"); 

      var successAttributes = 
       from attribute in xmlcode.Attributes() 
       where attribute.Name.LocalName=="success" 
       select attribute ; 

      if(successAttributes.Count()>0) 
      foreach (var sa in successAttributes) 
      { 
       Console.WriteLine(sa.Value);   
      } 
      Console.ReadLine(); 
     } 
    } 
+0

Xem nhận xét của tôi về câu trả lời của Rewinder; câu trả lời này có cùng một vấn đề. Nó sẽ làm việc trong trường hợp tầm thường này, nhưng là một thực tế rất xấu nói chung. –

+0

Vâng, bạn nói đúng. Tôi đã chỉnh sửa mã để tìm kiếm và in giá trị của tất cả các giá trị thuộc tính 'thành công' trong đoạn mã XML bất kể thứ tự hoặc vị trí của chúng. Bây giờ hãy trả lại Zero của tôi :) – explorer

8

Nếu bạn tải XML vào một XmlDocument, có nhiều cách để lấy giá trị của thuộc tính. Bạn có thể sử dụng XPath để tìm ra thuộc tính:

XmlAttribute a = doc.SelectSingleNode("/reply/@success"); 
Console.Write(a.Value); 

Nếu bạn đã có XmlElement rằng thuộc tính xuất hiện trên (mà trong trường hợp này là yếu tố tài liệu), sau đó bạn chỉ có thể sử dụng GetAttribute:

Console.Write(doc.DocumentElement.GetAttribute("success")); 

Có các cách tiếp cận tương tự nếu bạn đang sử dụng XPathDocument hoặc XmlReader hoặc XDocument. Tuy nhiên, trong tất cả các trường hợp, bạn muốn nhận được thuộc tính theo tên tên, chứ không phải vị trí của nó. Trong trường hợp thử nghiệm của bạn chỉ có một thuộc tính; trong bất kỳ ứng dụng thực tế nào có nhiều thuộc tính có khả năng, và việc sắp xếp thuộc tính trong XML không đáng kể. Hai phần tử này tương đương về mặt ngữ nghĩa:

<a foo='true' bar='false'/> 

<a bar='false' foo='true'/> 

Bạn thậm chí không biết rằng trình phân tích cú pháp XML sẽ trình bày các thuộc tính theo thứ tự xuất hiện trong tài liệu; tùy thuộc vào việc triển khai, trình phân tích cú pháp có thể cung cấp cho bạn theo thứ tự bảng chữ cái hoặc theo thứ tự ngẫu nhiên. (Tôi đã thấy cả hai.)

+0

Nhưng chúng ta đang nói C# /. NET cụ thể ở đây và không đề cập đến trong tài liệu MS mà chỉ định các thuộc tính 'XmlReader' hoặc' XmlDocument' trong bất kỳ thứ gì khác ngoài tài liệu/thứ tự đầu vào. để "lấy thuộc tính đầu tiên xuất hiện trong XML đầu vào", điều này có thể đạt được bằng cách tìm thuộc tính có chỉ mục bằng không. Tất nhiên, câu hỏi không phải là yêu cầu thuộc tính "đầu tiên" vì vậy nó là chính xác trong trường hợp này để sử dụng tên thuộc tính thay vì chỉ mục. –

+1

Không có sự đảm bảo trong tài liệu MS mà các thuộc tính chỉ mục 'XmlDocument' (thực sự,' XmlNamedNodeMap') lập chỉ mục theo bất kỳ thứ tự xác định nào. Có những ví dụ cho thấy rằng các nút được lập chỉ mục theo thứ tự chúng được thêm vào bản đồ. Nhưng những ví dụ trên trang này - http://msdn.microsoft.com/en-us/library/7sf9z378.aspx - và những gì, cầu nguyện, là từ đầu tiên trong tiêu đề? –

1
var at = 
XElement.Parse("<reply success=\"true\">More nodes go </reply>").Attribute("success"); 
if (at != null) Console.Write(at.Value); 
0

Mã sau hoạt động cho tôi.

String strXML = "<reply success=\"true\">More nodes go here</reply>"; 

    using (XmlReader reader = XmlReader.Create(new StringReader(strXML))) 
    { 
      reader.ReadToFollowing("reply"); 
      reader.MoveToContent(); 
      string strValue = reader.GetAttribute("success"); 
      Console.WriteLine(strValue); 
    } 
Các vấn đề liên quan