如何使用LINQ C#正确搜索xml文档

Tim*_*img 4 c# xml linq

嘿家伙和女孩我很难搞清楚如何正确搜索xml文档.我一直在阅读其他形式如今疯狂,但似乎无法理解它.希望有人可以给我一些更详细的信息,告诉我如何正确使用LINQ.这是XML文件.

<?xml version="1.0" encoding="utf-8"?>
<body>
  <Customers>
    <Client>
      <Firstname Value="someguy" />
      <LastName Value="test" />
      <PhoneNumber Value="541555555" />
      <Address Value="55 nowhere" />
      <City Value="sometown" />
      <State Value="somestate" />
    </Client>
  </Customers>
</body>
Run Code Online (Sandbox Code Playgroud)

我要完成的工作是返回与客户名称匹配的每个元素的所有值.这是我的代码.

       IEnumerable<XElement> test = doc.Root.Descendants()
            .Where(nodeName => nodeName.Name == "Client"
            && nodeName.Descendants().Any(x => x.Name == "Firstname"
            && x.Value == "someguy"));

        foreach (XElement m in test)
        {
            MessageBox.Show(m.ToString());
        }
Run Code Online (Sandbox Code Playgroud)

真的很感激帮助.如果可能的话,还请解释一下,如果你愿意,使用LINQ的想法就像格式一样.不确定如何解释我的要求,但大多数情况下只是更多地了解它的工作方式或格式等...

编辑

我已经尝试了解决方案,但仍然没有任何东西似乎工作.请告诉我这里我做错了什么.

        private void button2_Click(object sender, EventArgs e)
    {
        string seach = txtSearch.Text;

        XDocument doc = XDocument.Load(@"C:\users\tim\desktop\test.xml");

        var result = doc.Elements("Customers")
            .Elements("Client")
            .Where(x => x.Elements("Firstname")
                         .Where(c => c.Attribute("Value").Value == "someguy")
                         .Any())
            .ToList();

        foreach (var m in result)
        {
            MessageBox.Show(m.ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

好的,所以我现在已经让它工作并输出我正在寻找的数据.有人可以告诉我,如果有更有效的方式来做我在此编辑下面发布的内容.

        private void button2_Click(object sender, EventArgs e)
    {
        string seach = txtSearch.Text;

        XDocument doc = XDocument.Load(@"C:\users\tim\desktop\test.xml");

        var result = (from clientNode in doc.Root.Descendants("Client")
                      from name in clientNode.Descendants("Firstname")
                      where name.Attribute("Value").Value == "someguy"
                      select new
                      {
                          Fname = clientNode.Element("Firstname").Attribute("Value").Value,
                          Lname = clientNode.Element("LastName").Attribute("Value").Value,
                          Phone = clientNode.Element("PhoneNumber").Attribute("Value").Value,
                          Address = clientNode.Element("Address").Attribute("Value").Value,
                          City = clientNode.Element("City").Attribute("Value").Value,
                          State = clientNode.Element("State").Attribute("Value").Value
                      });

        foreach (var m in result)
        {
            MessageBox.Show(m.Fname + "\n" +
                            m.Lname + "\n" +
                            m.Phone + "\n" +
                            m.Address + "\n" +
                            m.City + "\n" +
                            m.State);
        }
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 8

您可以使用XElement和搜索LINQ查询,如下所示:

XElement doc = XElement.Parse(xml);
var result = doc.Elements("Customers")
                .Elements("Client")
                .Where(x => x.Elements("Firstname")
                             .Where(c => c.Attribute("Value").Value == "someguy")
                             .Any())
                .ToList();
Run Code Online (Sandbox Code Playgroud)

所以输入:

var xml =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<body>
    <Customers>
    <Client>
        <Firstname Value=""someguy"" />
        <LastName Value=""some last name"" />
        <PhoneNumber Value=""123456"" />
        <Address Value=""some where"" />
        <City Value=""some town"" />
        <State Value=""some state"" />
    </Client>
    <Client>
        <Firstname Value=""someotherguy"" />
        <LastName Value=""some other last name"" />
        <PhoneNumber Value=""123456"" />
        <Address Value=""some other where"" />
        <City Value=""some other town"" />
        <State Value=""some other state"" />
    </Client>
    </Customers>
</body>";

XElement doc = XElement.Parse(xml);
var result = doc.Elements("Customers")
                .Elements("Client")
                .Where(x => x.Elements("Firstname")
                             .Where(c => c.Attribute("Value").Value == "someguy")
                             .Any())
                .ToList();
Run Code Online (Sandbox Code Playgroud)

结果将是:

<Client>
    <Firstname Value=""someguy"" />
    <LastName Value=""some last name"" />
    <PhoneNumber Value=""123456"" />
    <Address Value=""some where"" />
    <City Value=""some town"" />
    <State Value=""some state"" />
</Client>
Run Code Online (Sandbox Code Playgroud)

并且您可以显示值,例如:

MessageBox.Show(string.Format("Firstname: {0}\nLastName: {1}\nPhoneNumber: {2}\nAddress: {3}\nCity: {4}\nState: {5}",
                result[0].Element("Firstname").Attribute("Value").Value,
                result[0].Element("LastName").Attribute("Value").Value,
                result[0].Element("PhoneNumber").Attribute("Value").Value,
                result[0].Element("Address").Attribute("Value").Value,
                result[0].Element("City").Attribute("Value").Value,
                result[0].Element("State").Attribute("Value").Value));
Run Code Online (Sandbox Code Playgroud)

注意:

  • 如果您知道结果应该包含0或1个元素,则可以使用FirstOrDefault()而不是ToList();
  • 元素名称区分大小写,因此请注意Firstname.
  • 例如,您可以使用XElement.Load()从文件加载XElement doc = XElement.Load(@"d:\file.xml");
  • 如果以这种方式选择元素,则查询将更具容错能力 .Where(c => c.Name.ToString().ToLower() == "Customers".ToLower())
  • 如果以这种方式选择属性,则查询将更具容错性 .Where(c => c.Attributes("Value").Where(a=>a.Value == "someguy").Any())