2011-06-24 10 views
0

私は、次の形式でXMLを持っている:Xelement内のすべての子ノードを連結する方法は?

<parent> 
      <child id="1"> test1 </child> 
      <child id="2"> test2 </child> 
</parent> 

は、どのように私はすべてのchildNodesのcsvファイルを得ることができますか?同様に、これは私がそれを必要とする方法です:

<parent> 
      <children>1|test1;2|test2</children> 
</parent> 

ここで、と;区切り文字です。

どのようにLINQを使用して行うことができますか?

答えて

0
var xml = @"<parent> 
       <child id=""1""> test1 </child> 
       <child id=""2""> test2 </child> 
     </parent>"; 
XElement parentElement = XElement.Parse(xml); 
var childElements = parentElement.Elements("child").ToList(); 
var concatenatedValue = string.Join(";", childElements.Select(c => c.Attribute("id").Value + "|" +c.Value).ToArray()); 
childElements.ForEach(c => c.Remove()); 
parentElement.Add(new XElement("child", concatenatedValue)); 

var newXml = parentElement.ToString(); 
+0

感謝バラ!それは働いています。 –

0
File.WriteAllText("C:\\myText.csv", 
    "<parent><children>" + 
    String.Join(";", 
     XDocument.Load("C:\\my.xml").Descendants("child") 
     .Select(e => e.Attribute("id") + "|" + e.Value)) + 
    "</children></parent"); 
0
XDocument inDoc = XDocument.Parse(
    "<parent><child id='1'>test1</child><child id='2'>test2</child></parent>"); 
XDocument outDoc = XDocument.Parse(
    String.Format("<parent><children>{0}</children></parent>", 
     String.Join(";", 
      inDoc.Root.Elements() 
      .Select(e => e.Attribute("id").Value + "|" + e.Value) 
      .ToArray()))); 
+0

単純な連​​結のためにString.Formatと同じように高価なものを使用するのはなぜですか? –

+0

これは、式の最後にLinq部分を分離しているので、この例をクリーナーにしたからです。通知私は属性と要素の値を結合している場所の内部に単純なコンカットを使用しました。あなたは明らかに外側のコンテンツにもconcatを使用することができます - それは(少なくとも私にとっては)何が起こっていたかをはっきりさせるほどではありませんでした。 – daveaglick

関連する問題