从XDocument中检索值

时间:2014-06-12 21:03:39

标签: c# linq

我有一个名为 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子句只是为了比较两者。

2 个答案:

答案 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这种情况下(几乎)相同。