LINQ to XML 根据条件提取

LINQ to XML extract based on condition

我有以下重复的 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"));

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

你可以使用Any方法

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

或者只是尝试获取元素并检查是否为空:

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"));

您可以使用 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");