【发布时间】:2015-09-29 20:42:06
【问题描述】:
我很难弄清楚如何正确搜索 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>
我想要完成的是返回与客户姓名匹配的每个元素的所有值。这是我的代码。
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());
}
非常感谢您的帮助。如果可能的话,还请解释一下使用 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);
}
【问题讨论】:
-
很难理解你想要什么。如果满足
Firstname.Value="someguy"条件,你想得到Client节点吗? -
基本上我要做的是获取与我的条件匹配的元素内每个元素的所有值。我正在寻找“someguy”我需要他的所有信息#他的地址等...
-
@Timg
XElement doc = XElement.Parse(xml); -
所以我必须将 xml 放入代码本身? vs 从单个文件访问它?
-
@Timg 你读过我回答的注释部分吗?