Один ко многим Linq в запрос XML

У меня есть XML строка, которая выглядит следующим образом:

<Attributes>
    <ProductAttribute id="1">
        <ProductAttributeValue>
            <Value>a</Value>
        </ProductAttributeValue>
    </ProductAttribute>
    <ProductAttribute id="2">
        <ProductAttributeValue>
            <Value>a</Value>
        </ProductAttributeValue>
        <ProductAttributeValue>
            <Value>b</Value>
        </ProductAttributeValue>
    </ProductAttribute>    
</Attributes>

Я хотел бы вернуть IEnumerable следующим образом:

Id Value
1  a
2  a b

Я пробовал это и получил только значение «b» для Id «2»:

XElement e = XElement.Parse(xmlString);
var q = from pa in e.Elements("ProductAttribute")
from pav in pa.Elements("ProductAttributeValue").Elements("Value")
select new
{
Id = (int)pa.Attribute("id"),
Value = (string)pav
};

Я пробовал это:

 XElement e = XElement.Parse(xmlString);
    var q = from pa in e.Elements("ProductAttribute")
    select new
    {
    Id = (int)pa.Attribute("id"),
    Value = pa.Elements("ProductAttributeValue").Elements("Value")
    };

Но не может привести значение в виде строки. Используя LINQPad, результат был таким:

Id Value
1  a
2  <Value>a</Value>
   <Value>b</Value>

Я пытаюсь просто вернуть значения. Это вообще возможно?

Спасибо.

1
задан trevorc 27 August 2010 в 01:09
поделиться

2 ответа

Если вам нужна объединенная строка этих значений, например "ab"

 XElement e = XElement.Parse(xmlString);
    var q = from pa in e.Elements("ProductAttribute")
    select new
    {
    Id = (int)pa.Attribute("id"),
     Value = string.Join(" " ,
                    pa.Elements("ProductAttributeValue")
                     .Elements("Value")                                            
                     .Select(x=>x.Value)
                     .ToArray())
    };
1
ответ дан 2 September 2019 в 21:49
поделиться
XElement e = XElement.Parse(xmlString); 
var q = from pa in e.Elements("ProductAttribute") 
select new 
{ 
Id = (int)pa.Attribute("id"), 
Value = from pav in pa.Elements("ProductAttributeValue").Elements("Value") select pav.Value 
}; 

Конечно, Value будет IEnumerable.

Редактировать:

Если вы хотите, чтобы вывод объединял элементы Value в одну строку, вы можете сделать это:

XElement e = XElement.Parse(xmlString); 
var q = from pa in e.Elements("ProductAttribute") 
select new 
{ 
Id = (int)pa.Attribute("id"), 
Value = string.Join(" ", (from pav in pa.Elements("ProductAttributeValue").Elements("Value")
        select pav.Value).ToArray())
};

Тогда вывод будет:

Id Value
1  a 
2  a b
1
ответ дан 2 September 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: