2010-08-27 6 views
1

J'ai une chaîne XML qui ressemble à ceci:un à plusieurs LINQ pour XML requête

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

Je voudrais revenir un IEnumerable comme ceci:

Id Value 
1 a 
2 a b 

J'ai essayé et seulement a obtenu la valeur "b" pour 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 
}; 

J'ai essayé ceci:

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

Mais n'a pas pu lancer la valeur en tant que chaîne. En utilisant LINQPad la sortie était comme ceci:

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

J'essaye juste de renvoyer les valeurs. Est-ce seulement possible?

Merci.

Répondre

1

Si vous voulez une chaîne contatenated de ces valeurs comme "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()) 
    }; 
+0

Cette est également très utile! Merci campbell. FYI il y a une parenthèse fermante manquante de votre exemple de code. A part ça, ça a fonctionné parfaitement. – trevorc

+0

@joebloe: merci pour la note sur le paren. N'oubliez pas de voter (lorsque vous avez suffisamment de rep) et choisissez une «réponse acceptée» dans le cadre du système de réputation sur StackOverflow. Donner de la réputation à ceux qui prennent le temps de répondre aux questions. J'ai voté pour votre question, car je pensais que c'était une bonne question, et pour vous aider à vous faire représenter. –

1
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 
}; 

Bien sûr, la valeur sera un IEnumerable<string>.

Edit:

Si vous voulez que la sortie de concat les éléments de valeur dans une chaîne que vous pouvez faire ceci:

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

Ensuite, la sortie sera:

Id Value 
1 a 
2 a b 
+0

C'est tout! J'ai essayé quelques variations avec 'in' mais je n'ai pas pu obtenir la syntaxe correcte. Merci Richard. – trevorc

+0

Votre bienvenue ... –