2010-04-20 28 views
19

Truy vấn này có vẻ hợp lệ, nhưng tôi có 0 kết quả.Tìm các phần tử theo thuộc tính bằng cách sử dụng XDocument

IEnumerable<XElement> users = 
      (from el in XMLDoc.Elements("Users") 
      where (string)el.Attribute("GUID") == userGUID.ToString() 
      select el); 

XML của tôi là như sau:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Users> 
    <User GUID="68327fe2-d6f0-403b-a7b6-51860fbf0b2f"> 
    <Key ID="F7000012ECEAD101"> 
     ... 
    </Key> 
    </User> 

</Users> 

Bạn có bất cứ manh mối để làm sáng tỏ vào điều này?

Trả lời

26

thay đổi Users trong dòng thứ 2 thành User. Như thế này:

IEnumerable<XElement> users = (from el in XMLDoc.Root.Elements("User") 
            where (string)el.Attribute("GUID") == userGUID.ToString() 
            select el); 

Tôi giả định XMLDoc là XDocument chứ không phải chính phần tử gốc.

+1

Cảm ơn, đây là một phần những gì tôi cần, một sai lầm ngu ngốc từ tôi. – Nacho

+3

Như Jon chỉ ra bên dưới, việc truyền đến đúng loại là lựa chọn tốt hơn. Ngoài ra, nếu bạn sử dụng "el.Attribute (" GUID ") .Giá trị" bạn sẽ tự động nhận được một chuỗi như là loại trả về và không có nhu cầu cho các diễn viên. –

+2

'root' phải là' Gốc' trong 'XMLDoc.root.Elements (" Người dùng ")'. – Appulus

43

Vâng, các thành phần Người dùng không có thuộc tính GUID. Hai tùy chọn gợi ý:

  • Nhìn vào XDocument.Root.Elements("User")
  • Sử dụng Descendants("User") để tìm tất cả yếu tố tài.

Tôi sẽ kết hợp trước đây cho thời điểm này. Điều đó cho chúng tôi:

IEnumerable<XElement> users = 
      (from el in XMLDoc.Root.Elements("User") 
      where (string) el.Attribute("GUID") == userGUID.ToString() 
      select el); 

Bây giờ, chúng tôi vẫn có thể dọn dẹp thêm. Trước hết, chúng ta hãy đúc để Guid thay vì string:

IEnumerable<XElement> users = 
    (from el in XMLDoc.Root.Elements("User") 
    where (Guid) el.Attribute("GUID") == userGUID 
    select el); 

Tuy nhiên có không có nhiều lý do để sử dụng một biểu thức truy vấn ở đây ... tất cả các bạn đang áp dụng là một vị duy nhất. Hãy chỉ sử dụng Where phương pháp trực tiếp:

IEnumerable<XElement> users = 
    XMLDoc.Root 
      .Elements("User") 
      .Where(el => (Guid) el.Attribute("GUID") == userGUID); 

Làm thế nào bạn đẻ nó ra là tùy thuộc vào bạn, tất nhiên :) Với một đường dài, có lẽ bạn có thể sắp xếp mọi thứ dưới một dòng đầu tiên dài hơn:

IEnumerable<XElement> users = XMLDoc.Root 
            . etc 

Bây giờ, cuối cùng - điều gì xảy ra nếu phần tử User không có thuộc tính GUID? Hiện tại, mã này sẽ ném một ngoại lệ. Đó có thể là chính xác những gì bạn muốn - hoặc nó có thể không. Nếu không, bạn có thể làm cho nó bỏ qua những điều đó bằng cách đúc để Nullable<Guid> aka Guid? thay vì:

IEnumerable<XElement> users = 
    XMLDoc.Root 
      .Elements("User") 
      .Where(el => (Guid?) el.Attribute("GUID") == userGUID); 
+0

Cảm ơn, điều này cũng rất tuyệt vời, quá tệ, tôi chỉ có thể đánh dấu một cái là đúng. – Nacho

+13

tôi sẽ không lo lắng về điều đó. Jon có 470 nghìn điểm. – FlavorScape

+2

và ông đã tăng gấp đôi số điểm của mình trong ba năm –

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