LINQ to XML基于条件提取

时间:2015-01-27 16:36:27

标签: c# linq

我有以下重复的XML结构,我必须从中创建一个对象列表:

<entries>
    <entry>
        <start>2013-10-01T00:00:00.000+02:00</start>
        <end>2013-11-01T00:00:00.000+02:00</end>
        <value>27.02</value>
        <isExtracted>true</isExtracted>
    </entry>
    <entry>
        <start>2013-11-01T00:00:00.000+02:00</start>
        <end>2013-12-01T00:00:00.000+02:00</end>
        <value>27.02</value>
        <isExtracted>true</isExtracted>
    </entry>
    <entry>
        <start>2013-12-01T00:00:00.000+02:00</start>
        <end>2014-01-01T00:00:00.000+02:00</end>
        <value>27.02</value>
    </entry>
</entries>

我想只提取那些带有isExtracted xml标签的元素!

我现在所做的是以下内容:

    var extract = xElemMaster.Elements("entries").Elements("entry")
                        .Where(elem => elem.Name.Equals("isExtracted"));

但我没有得到任何结果。可能出现什么问题?

2 个答案:

答案 0 :(得分:4)

您可以使用Any方法

 xElemMaster.Elements("entries")
            .Elements("entry")
            .Where(elem => elem.Elements("isExtracted").Any());

或者只是尝试获取元素并检查null:

xElemMaster.Elements("entries")
            .Elements("entry")
            .Where(elem => elem.Element("isExtracted") != null);

为了使其更具可读性,我将创建一个扩展方法并改为使用它:

public static bool HasElement(this XElement source, string elementName)
{
      return source.Element(elementName) != null;
}

xElemMaster.Elements("entries")
            .Elements("entry")
            .Where(elem => elem.Element.HasElement("isExtracted"));

答案 1 :(得分:1)

您可以使用Descendants搜索节点和子节点,然后使用Any检查IsExtracted是否存在。

var extract = xElemMaster.Descendants("entry")   
                .Where(w=>w.Elements("isExtracted").Any())

您可能还想检查isExtracted == True还是false

 var extract = x.Descendants("entry")
            .Where(w => w.Elements("isExtracted").Any() && w.Element("isExtracted").Value=="true");