Запросы XElements для детей с атрибутами детей - PullRequest
1 голос
/ 11 мая 2010

Вот схема XML:

<Root> 
  <Thing att="11">    
    <Child lang="e">  
       <record></record>
       <record></record>
       <record></record>  
   </Child >
   <Child lang="f">  
       <record></record>  
       <record></record>                
       <record></record>
   </Child > 
 </Thing> 
</Root>

У меня есть следующее:

TextReader reader = new StreamReader(Assembly.GetExecutingAssembly()
                 .GetManifestResourceStream(FileName));

   var data = XElement.Load(reader);
foreach (XElement single in Data.Elements())
 {
      // english records
      var EnglishSet = (from e in single.Elements("Child")
         where e.Attribute("lang").Equals("e")
        select e.Value).FirstOrDefault();
}

Но я ничего не получаю. Я хочу иметь возможность для каждой «вещи» выбрать «ребенка», где атрибут «lang» равен значению.

Я тоже пробовал это, но это не сработало.

var FrenchSet = single.Elements("Child")
.Where(y => y.Attribute("lang").Equals("f"))
.Select(x => x.Value).FirstOrDefault();

Ответы [ 3 ]

2 голосов
/ 11 мая 2010

Вы проверяете, равен ли объект XAttribute строке "e".
Поскольку объект XAttribute никогда не равен строке, он не работает.

Вам необходимо проверить XAttribute объекта Value, например:

where y => y.Attribute("lang").Value == "e"
1 голос
/ 11 мая 2010
var EnglishSet = (from e in single.Elements("Child")
         where e.Attribute("lang").Value.Equals("e")
        select e).FirstOrDefault();

Как сказал Слакс, вы проверяли, что атрибут, а не его значение, был "e".Вам также не нужно select e.Value, потому что у дочерних узлов нет значения, у которого есть дочерние записи. 1003 *

1 голос
/ 11 мая 2010

Вы сравниваете объект атрибута со строкой "e", а не со значением объекта attrbute. Вы также возвращаете значение узла, а не узла. Поскольку значение пустое, вы просто получите пустую строку.

Попробуйте вместо этого:

var EnglishSet = (from e in single.Elements("Child")
                  where e.Attribute("lang").Value == "e"
                  select e).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...