我有以下XML文件:
<GSP>
<RES>
<R N="1">
<FS NAME="date" VALUE="2013-08-26"/>
<MT N="Title" V="article title"/>
<MT N="UrlTitle" V="article url title"/>
<MT N="Description" V="Lorem ipsum dolor sit amet, consectetur adipisicing elit, deserunt mollit anim id est laborum."/>
<MT N="IsSpecialArticle" V="true"/>
</R>
<R N="2">
<FS NAME="date" VALUE="2013-08-20"/>
<MT N="Title" V="article title 2"/>
<MT N="UrlTitle" V="article url title 2"/>
<MT N="Description" V="Lorem ipsum dolor sit amet, consectetur adipisicing elit, deserunt mollit anim id est laborum. 2"/>
<MT N="IsSpecialArticle" V="false"/>
</R>
<R N="3">
<FS NAME="date" VALUE="2013-08-20"/>
<MT N="Title" V="article title 3"/>
<MT N="UrlTitle" V="article url title 3"/>
<MT N="Description" V="Lorem ipsum dolor sit amet, consectetur adipisicing elit, deserunt mollit anim id est laborum. 3"/>
<MT N="IsSpecialArticle" V="true"/>
</R>
</RES>
</GSP>
以下代码加载到XElement和xml文档中:
XElement xElement = XElement.Load(Server.MapPath("~/Xml/samplexml.xml"));
我的问题如下,我不知道如何配置以下句子,以便在元素MT上获取那些在V属性上具有“true”的项目,其中N =“IsSpecialArticle”。
xElement.Element("RES").Elements("R").Select(??????).Where(???);
你知道我怎么能成功吗?
提前多多感谢。
最好的问候。
何。
答案 0 :(得分:4)
首先,我会将您的XML加载到XDocument
而不是XElement
:
var doc = XDocument.Load(Server.MapPath("~/Xml/samplexml.xml"));
查询:
var specialItems = from r in doc.Root.Elements("RES").Elements("R")
let mt = r.Elements("MT").FirstOrDefault(x => (string)x.Attribute("N") == "IsSpecialArticle")
let isTrue = mt != null && (bool)mt.Attribute("V")
where isTrue
select r;
答案 1 :(得分:1)
xElement
.Element("RES")
.Elements("R")
.Where
(
x=>
x
.Elements("MT")
.Where
(
z=>
z.Attribute("N").Value == "IsSpecialArticle"
)
.Select
(
z=>
z.Attribute("V").Value
).SingleOrDefault() == "true"
)
答案 2 :(得分:1)
这样的事情:
var res = (from p in xElement.Element("RES").Elements("R")
where p.Elements("MT").Any(q =>
(string)q.Attribute("N") == "IsSpecialArticle" &&
(bool)q.Attribute("V") == true)
select p).ToArray();
我们使用Any()
运算符查看R
元素的“内部”,然后查看XAttribute
的各种显式转换,以将属性值转换为.NET类型。
请注意(bool)q.Attribute("V") == true
“太多”:-) (bool)q.Attribute("V")
就足够了,但我认为在这种特殊情况下,== true
会使表达式更具可读性。
如果V
是可选的,您可以
(bool?)q.Attribute("V") == true)
请注意,在这种情况下,== true
是必需的。