2011-08-28 41 views
8

tôi đã sau tập tin xmlđọc file xml sử dụng LINQ

<?xml version="1.0" encoding="utf-8"?> 
<Users> 
    <User> 
     <Name>John Smith</Name> 
     <test> 
      <Date>23.05.2011</Date> 
      <points>33</points> 
     </test> 
     <test> 
      <Date>22.06.2011</Date> 
      <points>29</points> 
     </test> 
    </User> 
</Users> 

và tôi muốn sử dụng LINQ để trích xuất các ngày và các điểm của các bài kiểm tra trong đó username là "John Smith" ..

Tôi sẽ xây dựng LINQ như thế nào?

tôi đã làm những điều sau đây, nhưng không được làm việc như tôi muốn:

XElement main = XElement.Load(@"users.xml"); 

string t = "John Smith"; 
var v = from user in main.Elements("User") 
     where t == users.Element("Name").Value 
     select users; 

MessageBox.Show(v.First().Element("Date").Value.ToString()); 
+1

Mã của bạn không được biên dịch. Bạn đang sử dụng 'người dùng' nơi bạn nên sử dụng' người dùng'. Và bạn có lỗi đánh máy trong quá trình khởi tạo 't'. – svick

Trả lời

7

Tôi không chắc chắn những gì định dạng mà bạn muốn đầu ra được, nhưng mẫu mã này sẽ nhận được ngày và điểm. Đây dự án kết quả vào một loại vô danh:

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Load(@"users.xml"); 

     var results = main.Descendants("User") 
      .Descendants("Name") 
      .Where(e => e.Value == "John Smith") 
      .Select(e => e.Parent) 
      .Descendants("test") 
      .Select(e => new { date = e.Descendants("Date").FirstOrDefault().Value, points = e.Descendants("points").FirstOrDefault().Value }); 

     foreach (var result in results) 
      Console.WriteLine("{0}, {1}", result.date, result.points); 
     Console.ReadLine(); 
    } 
} 

Và kết quả là:

23.05.2011, 33 
22.06.2011, 29 
+0

TUYỆT VỜI .. cảm ơn bạn làm cách nào tôi chèn mới "trong ví dụ này" nút thứ ba " có ngày và điểm cho người dùng đó (John Smith) trong tệp xml? – brandon

+0

@JohnD Điều này cực kỳ hữu ích. Cảm ơn bạn. –

1
XDocument main = XDocument.Load(@"users.xml"); 

string t = "John Smith"; 
var v = from user in main.Descendants("User") 
    where t == user.Element("Name").Value 
    select user; 

MessageBox.Show(v.First().Element("Date").Value.ToString()); 

nên làm các trick.

1

Hãy thử này ra

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Parse(
@"<Users> 
    <User> 
     <Name>John Smith</Name> 
     <test> 
      <Date>23.05.2011</Date> 
      <points>33</points> 
     </test> 
     <test> 
      <Date>22.06.2011</Date> 
      <points>29</points> 
     </test> 
    </User> 
</Users>"); 

     var users = 
      from m in main.Elements("User") 
      where (string)m.Element("Name") == "John Smith" 
      select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value); 
     foreach (var user in users) 
      Console.WriteLine(user); 
     Console.ReadLine(); 
    } 
} 

Trân

0

Và về câu hỏi khác của bạn để thêm nút khác để John Smith, đây sẽ là giải pháp:

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Parse(
    @"<Users> 
     <User> 
      <Name>Alex</Name> 
      <test> 
       <Date>08.05.2011</Date> 
       <points>4</points> 
      </test> 
     </User> 
     <User> 
      <Name>John Smith</Name> 
      <test> 
       <Date>23.05.2011</Date> 
       <points>33</points> 
      </test> 
      <test> 
       <Date>22.06.2011</Date> 
       <points>29</points> 
      </test> 
     </User> 
    </Users>"); 


    var users = 
     from m in main.Elements("User") 
     where (string)m.Element("Name") == "John Smith" 
     select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value); 

    XElement Mercury = main.Elements("User").Where(p => (String)p.Element("Name") == "John Smith").FirstOrDefault(); 
    Mercury.Add(new XElement("test", new XElement("Date", "06.06.2011"), new XElement("points", "01"))); 

    foreach (var user in main.Elements()) 
     Console.WriteLine(user); 

    Console.ReadLine(); 
} 

}

Đưa ra kết quả mong đợi tiếp theo:

<User> 
    <Name>Alex</Name> 
    <test> 
    <Date>08.05.2011</Date> 
    <points>4</points> 
    </test> 
</User> 
<User> 
    <Name>John Smith</Name> 
    <test> 
    <Date>23.05.2011</Date> 
    <points>33</points> 
    </test> 
    <test> 
    <Date>22.06.2011</Date> 
    <points>29</points> 
    </test> 
    <test> 
    <Date>06.06.2011</Date> 
    <points>01</points> 
    </test> 
</User> 
Các vấn đề liên quan