2012-06-27 3 views
1

У меня есть структуру XML, похожее на это:Linq для XML - получить следующий элемент одноранговых с определенным значением

<cars> 
    <car> 
    <make>Ford</make> 
    <model>F-150</model> 
    <year>2011</year> 
    <customs> 
     <customAttribute>Color</customAttribute> 
     <customValue>Black</customValue> 
     <customAttribute>Doors</customAttribute> 
     <customValue>2</customValue> 
    </customs> 
    </car> 
</cars> 

И я хочу, чтобы вернуть список автомобилей в метод, который выглядит примерно так:

return (from car in cars.Descendants("car") 
     select new Car { 
      Make = car.Element("make").Value, 
      Model = car.Element("model").Value, 
      Year = car.Element("year").Value 
      Color = ?????, 
      Doors = ????? 
     }); 

Как я могу заполнить поля «Цвет и двери»? Мне нужно получить значение customAttribute для соответствующего узла customValue.

Не совсем уверен, как это осуществить.

Большое спасибо!

ответ

2

У вас есть опечатка в вашем XML @line <year>, но ...

Это следует сделать трюк, несколько нулевых проверок было бы, конечно, лучше.

Кстати, если цвет (и двери) были атрибутами вместо узлов, это не было бы хуже ...

var result = cars.Descendants("car") 
       .Select(car => new Car 
        { 
         Make = car.Element("make").Value, 
         Model = car.Element("model").Value, 
         Year = car.Element("year").Value, 
         Color = (car.Element("customs").Elements("customAttribute").First(m => m.Value == "Color").NextNode as XElement).Value, 
         Doors = (car.Element("customs").Elements("customAttribute").First(m => m.Value == "Doors").NextNode as XElement).Value 
        }) 
       .ToList(); 
+0

Благодаря Рафаель, я исправил опечатку и добавил новую деталь. пользовательские узлы фактически имеют родительский узел. любая идея о том, как включить это? –

+0

@ChrisConway Отредактировано с учетом вашего нового требования. –

+0

потрясающий! отлично работал. большое спасибо! –

Смежные вопросы