嘿家伙和女孩我很难搞清楚如何正确搜索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)
您可以使用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)
注意:
FirstOrDefault()而不是ToList();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())| 归档时间: |
|
| 查看次数: |
8782 次 |
| 最近记录: |