Linq to xml扩展方法带过滤器

时间:2013-08-30 08:44:45

标签: c# linq linq-to-xml

我有以下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(???);

你知道我怎么能成功吗?

提前多多感谢。

最好的问候。

何。

3 个答案:

答案 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是必需的。