2013-01-24 47 views
15

Tôi có một XML kết quả như thế nàyXDocument lấy phần tử XML bởi giá trị của tên thuộc tính

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">16</int> 
    </lst> 
    <result name="response" numFound="3" start="0" maxScore="1.0"> 
    <doc> 
     <str name="ContaFirstname"> 
     firstname1             
     </str> 
     <str name="ContaId">6557</str> 
     <str name="ContaJobTitle">Manager</str> 
     <str name="ContaSurname">surname1 
     </str> 
    </doc> 
    <doc> 
     <str name="ContaFirstname">firstname2</str> 
     <str name="ContaId">6203</str> 
     <str name="ContaJobTitle">Director</str> 
     <str name="ContaSurname">surname2</str> 
    </doc> 
    </result> 
</response> 

Tôi muốn có được một danh sách các đối tượng, và mọi đối tượng sẽ chứa giá trị của ContaFirstname, ContaId, ContaJobTitleContaSurname

tôi đã cố gắng một cái gì đó như thế này, nhưng đó là không đúng bởi vì tôi nhận được tất cả chúng NULL

var test = from c in xml.Descendants("doc") 
        select new 
        { 
         firstname = c.Element("ContaFirstname"), 
         surnmane = c.Element("ContaSurname") 
        }; 

Vậy làm cách nào để truy cập các thành phần này theo tên?

+1

Bạn có muốn kết quả là chuỗi hoặc XElements không? Câu trả lời bạn đã chấp nhận sẽ cung cấp cho bạn các yếu tố. –

+0

Vâng, thực sự tôi đã thực hiện một dàn diễn viên đơn giản để có được những gì tôi muốn. – kbaccouche

Trả lời

31

Bạn không muốn truy cập các phần tử theo số tên vì hầu hết mọi người sẽ giải thích tuyên bố đó. Bạn muốn truy cập các yếu tố bởi giá trị của thuộc tính name của họ:

firstname = (string) c.Elements("str") 
         .First(x => x.Attribute("name").Value == "ContaFirstname"); 
//etc 

Bạn cũng có thể muốn trừu tượng đó vào một phương pháp riêng biệt, vì nó sẽ là một nỗi đau để làm điều đó nhiều lần. Ví dụ:

public static XElement ElementByNameAttribute(this XContainer container, 
               string name) 
{ 
    return container.Elements("str") 
        .First(x => x.Attribute("name").Value == name); 
} 

Sau đó:

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.ElementByNameAttribute("ContaFirstname").Value, 
       surnmane = c.ElementByNameAttribute("ContaSurname").Value 
      }; 

Nếu bạn có bất kỳ cơ hội để cung cấp cho tài liệu của bạn một cơ cấu hợp lý hơn, đó sẽ là một lợi thế ...

+0

Cảm ơn câu trả lời của bạn và bạn đúng là điều khó hiểu. Tôi đã chỉnh sửa tiêu đề câu hỏi của mình để tránh điều đó. – kbaccouche

+0

@ the_ruby_racer: Xem chỉnh sửa của tôi để bao gồm một phương pháp mở rộng giúp cuộc sống của bạn dễ dàng hơn lặp lại cùng một mã và thời gian một lần nữa. –

+0

Đẹp! Tôi chấp nhận câu trả lời của bạn hoàn chỉnh hơn. Cảm ơn! – kbaccouche

3

Điều này giải quyết vấn đề của bạn:

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname"), 
       surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname") 
      }; 

hoặc, nếu bạn muốn giá trị (thay vì XElement:

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname").Value, 
       surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname").Value 
      }; 
+0

Vâng, đó là chính xác những gì tôi cần. Cảm ơn! – kbaccouche

+1

Điều đó sẽ làm cho các tham chiếu 'XElement' thuộc tính, điều này có vẻ lạ với tôi. –

+0

Điều đó hoàn toàn đúng, tôi đã cập nhật bài đăng của mình –

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