Фильтрация элементов XE по атрибутам дочернего элемента - PullRequest
0 голосов
/ 11 марта 2011

Я пытаюсь выбрать элементы на основе атрибутов субэлемента этого элемента.

Исходный 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, гдеэлемент фильтра этого элемента 1 соответствует предложению where в выражении.

Я довольно новичок в linq и не совсем уверен, что делаю неправильно.

1 Ответ

0 голосов
/ 05 апреля 2011

Что именно вы хотите выбрать из xml?Оператор select отсутствует в вашем операторе linq.Добавьте Select в конце вашего оператора linq, например, Select (независимо от тега)

Кроме того, вы перемещаетесь «по» элементу, который пытаетесь найти, т.е.

From rec In RecipeXmlDocument.Descendants("RECEPT")
* 1005.* должно быть
From rec In RecipeXmlDocument.Descendants

Ниже приведено исправленное утверждение, к которому необходимо объединить ваше предложение выбора

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")

ПРИМЕЧАНИЕ. Вам потребуется добавить некоторые элементы внутри тега, чтобы иметь возможностьвыбрать их

...