按后代元素的属性过滤XElements

时间:2011-03-11 08:52:48

标签: vb.net attributes filter linq-to-xml xelement

我正在尝试根据该元素的子元素的属性选择元素。

原创Xml:

 <Root>
      <Element1 id="1">
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <Filter attr1="1" attr2="0" attr3="0" attr4="1" attr5="0"></Filter>
      </Element1>
      <Element1 id="2">
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <Filter attr1="1" attr2="0" attr3="0" attr4="1" attr5="0"></Filter>
      </Element1>
      <Element1 id="3">
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <element2>XXXX</element2>
        <Filter attr1="1" attr2="0" attr3="0" attr4="1" attr5="0"></Filter>
      </Element1>
    </Root>

这是我到目前为止所做的:

Dim xmlElement = (From rec In RecipeXmlDocument.Descendants("RECEPT") _
Where (rec.Descendants("Filter").@poultry = Ing.Poultry.ToString() _
                   Or rec.Descendants("Filter").@attr1 = "1" _
                   Or rec.Descendants("Filter").@attr2 = "0" _
                   And (rec.Descendants("Filter").@attr3 = "1" _
                        Or rec.Descendants("Filter").@attr4 = "0" _
                        Or rec.Descendants("Filter").@attr5 = "1"

这会抛出以下错误:“抛出了类型'System.Linq.SystemCore_EnumerableDebugViewEmptyException'的异常。”

代码尝试做的是选择所有Element1,其中该element1的filter元素与该语句的where子句匹配。

我对linq很新,我不确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

您想从xml中选择什么?您的linq语句中缺少select语句。 添加linq语句末尾的Select,例如Select(标签中的任何内容)

此外,您正在“搜索”您要搜索的元素,即

From rec In RecipeXmlDocument.Descendants("RECEPT")

应该是

From rec In RecipeXmlDocument.Descendants

下面是一个修改过的语句,你需要连接你的select语句

Dim xmlElement = From rec In RecipeXmlDocument.Descendants Where rec...<Filter>.@poultry = Ing.Poultry.ToString Or rec...<Filter>.@attr1 = "1" Or rec...<Filter>.@attr2 = "0" And (rec...<Filter>..@attr3 = "1" Or rec...<Filter>.@attr4 = "0" Or rec...<Filter>.@attr5 = "1")

注意:您必须在标签内添加一些元素才能选择它们