2013-04-25 25 views
16

tôi cần để có được giá trị của nút con từ XDocument sử dụng LINQLàm thế nào để nhận được giá trị của nút con từ XDocument

<root> 
<Cust> 
    <ACTNumber>1234</ACTNumber> 
    <Address> 
     <Street></Street> 
     <City>123 Main street</City> 
     <State>AL</State> 
    </Address> 
</Cust> 
</root> 

Tôi đã cố gắng này: xDocTest.Root.Elements("Cust").Elements("ACTNumber")

Nếu tôi cố gắng Địa chỉ thay vì ACTNumber sau đó nó hoạt động . Nhưng nó không cho giá trị nút con.

Trả lời

35

Nếu chỉ có một Cust phần tử và chỉ có một ACTNumber yếu tố, sau đó thật dễ dàng:

string actNumber = doc.Root.Element("Cust").Element("ACTNumber").Value; 

Hoặc để lấy nó như là một long:

long actNumber = (long) doc.Root.Element("Cust").Element("ACTNumber"); 
+0

là nó thực sự cần thiết để đặt 'doc.Root.Element(). Element()'? Cách ngắn nhất để có được "ACTNumber" ngay lập tức, lần đầu tiên xảy ra, không có vấn đề gì cấp nó được tìm thấy trong? – MarioDS

+1

@MDeSchaepmeester: Đối với điều đó, bạn sẽ sử dụng 'doc.Descendants (" ACTNumber "). First()' –

6

Sử dụng này:

xDocTest.Root.Element("Cust").Element("Adress").Element("City").Value 

Nếu bạn sử dụng Elements (lưu ý số nhiều) nó mang lại cho u một IEnumerable, điều này sẽ được sử dụng như thế này:

XML

<Father> 
    <Child>Hello</Child> 
    <Child>World!</Child> 
</Father> 

C#

foreach(var childElement in Root.Elements("Child")) Console.WriteLine(childElement.Value); 

Hoặc lấy ví dụ của bạn:

foreach(var child in xdoc.Root.Element("Cust").Element("Address").Elements()) 
    Console.WriteLine(string.Format("{0} : {1}", child.Name, child.Value); 

Không chắc cách Phần tử hoạt động nếu bạn có nhiều Phần tử cùng tên. Vì vậy, bạn có thể muốn sử dụng Elements và Inerate trên tất cả các lần xuất hiện.

Và trong LINQ Nếu có nhiều hơn một khách hàng ...

var result = from cust in xdoc.Root.Elements("Cust") 

      where cust.Elements("ACTNumber").Any() // This is to make sure there 
                // is an element called ACTNumber 
                // otherwise .Value would create 
                // Nullrefexception. 

      select child.Element("ACTNumber").Value; 
+0

Cant tìm ra cách làm cho s từ Elements bold ... – CSharpie

+0

Bạn không thể, đó là điểm chính của một khối mã, để ngăn chặn bất kỳ đánh dấu nào được coi là đánh dấu thay vì văn bản. – Servy

+0

Tôi muốn sử dụng nó trong câu của tôi bắt đầu bằng "Nếu bạn sử dụng ..." – CSharpie

Các vấn đề liên quan