我正在尝试构建一个linq查询,该查询可以提取具有特定元素的所有节点。
在下面的例子中,您会注意到第二个条目有一些额外的元素:DisplayOnSignup,SortOrder等。
我想让linq给我所有具有SortOrder元素的入口节点。
xml doc看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<feed >
<entry>
<link href="/ws/customers/testacct/lists/removed" rel="edit"></link>
<id>http://api.constantcontact.com/ws/customers/testacct/lists/removed</id>
<title type="text">Removed</title>
<updated>2010-11-10T19:03:09.253Z</updated>
<author>
<name>Test</name>
</author>
<content type="application/vnd.ctct+xml">
<ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/removed">
<Name>Removed</Name>
<ShortName>Removed</ShortName>
</ContactList>
</content>
</entry>
<entry>
<link href="/ws/customers/testacct/lists/1" rel="edit"></link>
<id>http://api.constantcontact.com/ws/customers/testacct/lists/1</id>
<title type="text">General Interest</title>
<updated>2010-11-10T19:03:09.253Z</updated>
<author>
<name>Constant Contact</name>
</author>
<content type="application/vnd.ctct+xml">
<ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/1">
<OptInDefault>true</OptInDefault>
<Name>General Interest</Name>
<ShortName>General Interest</ShortName>
<DisplayOnSignup>Yes</DisplayOnSignup>
<SortOrder>0</SortOrder>
<Members id="http://api.constantcontact.com/ws/customers/testacct/lists/1/members"></Members>
<ContactCount>3</ContactCount>
</ContactList>
</content>
</entry>
</feed>
我的查询到目前为止看起来像:
XDocument loaded = XDocument.Parse(response);
result = (from entry in loaded.Descendants("entry")
select new CcList {
LinkHref = entry.Element("link").Attribute("href").Value,
Id = entry.Element("id").Value,
Title = entry.Element("title").Value,
Updated = entry.Element("updated").Value,
ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
}).ToList<CcList>();
我把什么作为where子句或者有更好的方法?
答案 0 :(得分:3)
你可以尝试:
var result = (
from entry in loaded.Descendants("entry")
where entry.Descendants("SortOrder").Count() > 0
select new CcList {
LinkHref = entry.Element("link").Attribute("href").Value,
Id = entry.Element("id").Value,
Title = entry.Element("title").Value,
Updated = entry.Element("updated").Value,
ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
}
).ToList<CcList>();
答案 1 :(得分:3)
XDocument loaded = XDocument.Parse(response);
var result = (
from entry in loaded.Descendants("entry")
where entry.Descendants().Any(x => x.Name == "SortOrder")
select new CcList {
LinkHref = entry.Element("link").Attribute("href").Value,
Id = entry.Element("id").Value,
Title = entry.Element("title").Value,
Updated = entry.Element("updated").Value,
ListName = entry.Element("content").Element("ContactList").Element("Name").Value,
OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value,
ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value,
SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value
}).ToList<CcList>();