0

我有以下 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>

以下代码将 xml 文档加载到 XElement 中:

XElement xElement = XElement.Load(Server.MapPath("~/Xml/samplexml.xml"));

我的问题如下,我不知道如何配置以下句子,以便在 N="IsSpecialArticle" 的元素 MT 上获取那些在 V 属性上具有“true”的项目。

xElement.Element("RES").Elements("R").Select(??????).Where(???);

你知道我怎么能归档这个吗?

提前非常感谢。

此致。

何塞。

4

3 回答 3

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;
于 2013-08-30T08:48:53.647 回答
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"
)
于 2013-08-30T08:48:09.170 回答
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是必要的。

于 2013-08-30T08:51:25.120 回答