2012-04-10 33 views
6

tập tin Xml của tôi:Chọn Xml Node sử dụng LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Customer> 
     <CustomerId>1f323c97-2015-4a3d-9956-a93115c272ea</CustomerId> 
     <FirstName>Aria</FirstName> 
     <LastName>Stark</LastName> 
     <DOB>1999-01-01T00:00:00</DOB> 
    </Customer> 
    <Customer> 
     <CustomerId>c9c326c2-1e27-440b-9b25-c79b1d9c80ed</CustomerId> 
     <FirstName>John</FirstName> 
     <LastName>Snow</LastName> 
     <DOB>1983-01-01T00:00:00</DOB> 
    </Customer> 
</ArrayOfCustomer> 

nỗ lực của tôi:

XElement toEdit = 
    (XElement)doc.Descendants("ArrayOfCustomer") 
       .Descendants("Customer") 
       .Where(x => Guid.Parse((x.Descendants("CustomerId") as XElement).Value) == customer.CustomerId) 
       .First<XElement>(); 

này ném ngoại lệ sau đây:

Object reference not set to an instance of an object. 

1) không phải là x an XElement?

2) đây có phải là nơi thích hợp để chọn một nút Xml không?

3) và tất nhiên bạn sẽ tìm thấy nút này theo số CustomerId như thế nào?

+0

tôi lần đầu tiên có trường hợp ngoại lệ: Không thể cast đối tượng của loại 'WhereEnumerableIterator'1 [Hệ thống .Xml.Linq.XElement] 'để nhập' System.Xml.Linq.XElement '. điều này là do tôi đã cố gắng truyền từ IEnumrable sang một XElement, tôi đã thêm phần mở rộng Đầu tiên () vào nó. bây giờ nó chỉ không thể tạo ra x như một XElement. –

Trả lời

4

Vấn đề của bạn là DescendentsWhere trả lại một không IEnumerable<XElement> một đơn XElement đó là những gì bạn đang sau. Bạn có thể sửa lỗi này như thế này:

XElement toEdit = doc.Descendants("ArrayOfCustomer") 
        .Descendants("Customer") 
        .Where(x => Guid.Parse(x.Descendants("CustomerId").Single().Value) == customer.CustomerId) 
        .FirstOrDefault(); 
+0

Chỉ cần lưu ý điều này yêu cầu chỉ có một phần tử CustomerId bên dưới một Khách hàng. Nếu có 0 hoặc> 1 nó sẽ ném một ngoại lệ. Và sau khi xem xét XML của mình, nó có lẽ là thích hợp. Nhưng chỉ là một cái gì đó để chỉ ra. –

+0

@AndrewFinnell trong khi về chủ đề này, bạn sẽ làm cách nào để chỉnh sửa nút đó, bây giờ tôi có thể cập nhật tất cả các phần tử (XElement) của Khách hàng nhưng cách cập nhật nút trong tệp? –

2

Bạn không được đúc x bạn đang truyền x.Descendants(). x.Descendants() trả về một tập hợp, do đó ngữ nghĩa phương thức số nhiều. Off đỉnh đầu của tôi bạn sẽ có thể để làm x.Descendants("CustomerId").FirstOrDefault() as XElement

1
XElement toEdit = (from c in doc.Descendants("Customer") 
    where Guid.Parse(c.Value) == customer.CustomerId 
    select c).SingleOrDefault(); 
1

tôi sẽ cơ cấu lại truy vấn của bạn như thế này:

XElement toEdit = doc.Descendants("Customer") 
         .Where(x => (Guid)x.Element("CustomerId") == customer.CustomerId) 
         .FirstOrDefault(); 
Các vấn đề liên quan