2013-03-15 12 views
11

Tôi có một XML trông như thế này:Duyệt qua mỗi XElement trong một XDocument

<myVal>One</myVal> 
<myVal>Two</myVal> 
<myVal>Three</myVal> 
<myVal>Four</myVal> 
<myVal>Five</myVal> 

Tôi muốn tải đó vào một XDocument và sau đó lặp qua từng XElement trong XDocument đó và đếm số lượng các nhân vật trong mỗi phần tử.

Cách tốt nhất để làm điều đó là gì?

Trước hết, tôi nhận thấy rằng tôi phải thêm phần tử gốc hoặc XDocument.Parse() sẽ không thể phân tích cú pháp dưới dạng XML. Vì vậy, tôi nói thêm:

<span> 
     <myVal>One</myVal> 
     <myVal>Two</myVal> 
     <myVal>Three</myVal> 
     <myVal>Four</myVal> 
     <myVal>Five</myVal> 
</span> 

Nhưng sau đó khi tôi làm:

foreach (XElement el in xDoc.Descendants()) 

el sẽ chứa toàn bộ XML, bắt đầu với <span> đầu tiên, bao gồm mỗi một trong những <myVal> s và sau đó kết thúc với </span>.

Làm cách nào để lặp qua từng phần tử XML (<myVal>One</myVal> v.v) bằng XDocument?

Tôi không biết trước tất cả các yếu tố XML sẽ được đặt tên, vì vậy chúng sẽ không phải lúc nào cũng được đặt tên là "myVal".

Trả lời

15

Sử dụng doc.Root.Elements() (đối với trẻ em trực tiếp của nút gốc mà tôi nghĩ là thực sự bạn muốn) hoặc doc.Root.Descendants() (nếu bạn muốn mọi hậu duệ, bao gồm mọi trẻ em có thể có của <myVal/>).

2

Làm như thế này:

string xml = " <span><myVal>One</myVal><myVal>Two</myVal><myVal>Three</myVal><myVal>Four</myVal><myVal>Five</myVal></span>"; 
XmlReader xr = XmlReader.Create(new StringReader(xml)); 
var xMembers = from members in XElement.Load(xr).Elements() select members; 

foreach (XElement x in xMembers) 
{ 
    var nodeValue = x.Value; 
} 

Bây giờ nếu bạn thấy giá trị của nodeValue bạn sẽ nhận One Two vv

+2

Tại sao các bạn áp dụng một bản sắc chọn để truy vấn của bạn? – Servy