Linq to XML запрос один ко многим - PullRequest
1 голос
/ 27 августа 2010

У меня есть строка 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 "значение для идентификатора" 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>

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 августа 2010
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<string>.

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

Если вы хотите, чтобы выходные данные объединяли элементы 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 голос
/ 27 августа 2010

Если вам нужна связанная строка таких значений, как "a b"

 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())
    };
...