使用linq读取xml文件

bra*_*don 8 c# xml linq

我有以下xml文件

<?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>
Run Code Online (Sandbox Code Playgroud)

我想使用linq来提取用户名是"John Smith"的测试的日期和点数.

我将如何构建我的linq?

我做了以下,但没有按我的意愿工作:

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()); 
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnD 7

我不确定你希望输出的格式是什么,但这个示例代码应该得到日期和点.这会将结果投影为匿名类型:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

23.05.2011, 33
22.06.2011, 29
Run Code Online (Sandbox Code Playgroud)