我有一个名为 doc 的XDocument,其中包含:
<bar>
<foo>
<item address="123">CCC</item>
</foo>
<definitions>
<item address="123">AAA</item>
<item address="456">BBB</item>
</definitions>
</bar>
我想要一个简单的linq查询(最好是lambda表达式)给出 123 表达式将返回 AAA
我怀疑我想使用 doc.Descendants(&#34; definitions&#34;),但我不确定如何实现lambda子句。实际上,很高兴看到lambda和where子句只是为了比较两者。
答案 0 :(得分:2)
IEnumerable<string> childList =
from el in doc.Element("bar").Element("definitions").Elements()
where el.Attribute("address").Value == "123"
select el.Value;
如果需要从不同名称的元素中提取值,我建议您使用XMLReader而不是XDocument。性能方面的XMLReader更好,因为它不像XDocument那样解析整个文档。
List<string> values = new List<string>();
using (StringReader sr = new StringReader(stringXML))
using (XmlReader xr = XmlReader.Create(sr))
{
while (xr.Read())
{
if (xr.NodeType == XmlNodeType.Element && xr.Name == "item" && xr.GetAttribute("address") == "123" )
{
values.Add(xr.GetAttribute("address"));
}
}
}
答案 1 :(得分:1)
您还需要使用XElement.Attribute属性。我会创建一个如下所示的扩展方法:
public static class ProjectExtensions
{
public static String GetValue(this XDocument source, String name, String value)
{
// return source
// .Root
// .Element(name)
// .Elements("item")
// .Where (f => f.Attribute("address").Value == value)
// .FirstOrDefault()
// .Value;
// or alternative
var result = (from e in source.Root.Element(name).Elements("item")
where e.Attribute("address").Value == value
select e.Value).FirstOrDefault();
return result;
}
}
然后用法如下:
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
<foo>
<item address=""123"">AAA foo</item>
</foo>
<definitions>
<item address=""123"">AAA definition</item>
<item address=""456"">BBB</item>
</definitions>
</bar>";
try
{
var document = XDocument.Parse(xml);
Console.WriteLine(document.GetValue("foo", "123"));
Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
输出结果为:
AAA foo
AAA definition
考虑添加异常处理和检查以防止错误。 LINQ fluent and query syntax在这种情况下(几乎)相同。