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

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

       

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

  IEnumerable 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()); } 

真的很感激帮助。 如果可能的话,还请解释一下,如果你愿意,使用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()); } } 

编辑:

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

  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); } 

您可以使用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(); 

所以输入:

 var xml = @"       
"; 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();

结果将是:

     

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

 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)); 

注意:

  • 如果您知道结果应该包含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())

作为@Reza Aghaei解决方案的替代方案, XPath也是一种解决方案

 var xml = @"       
"; XElement doc = XElement.Parse(xml); foreach(var client in doc .XPathSelectElements("./Customers/Client/Firstname[@Value='someguy']") .Select(x => x.Parent)) Console.WriteLine (client);

如果您更喜欢Linq To Xml解决方案:

 var results = (from c in doc.Descendants("Client") from f in c.Descendants("Firstname") where (string)f.Attribute("Value") == "someguy" select c).ToList(); foreach(var r in results) Console.WriteLine (r); 

如何:使用复杂过滤将Linq写入Xml查询