我有以下重复的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"));
但我没有得到任何结果。可能出现什么问题?
答案 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");