2011-11-10 21 views
0

すべての親要素に3つの子要素がすべて含まれるように、以下のXMLを完成したいと思います。 LINQの要素にn子として要素を追加する方法

<Parent> 
    <Child1></Child1> 
    <Child2></Child2> 
    <Child3></Child3> 
</Parent> 
<Parent> 
    <Child3></Child3> 
</Parent> 
<Parent> 
    <Child1></Child1> 
    <Child3></Child3> 
</Parent> 

は、だから私は、以下のコード

var elementsToChange = inputDoc.Descendants(CommonConstant.Parent); 
foreach (var element in elementsToChange) 
{ 
    if (element.Element(CommonConstant.Child1) == null) 
    { 
    //add child1 at 1 
    }  
    if (element.Element(CommonConstant.Child2) == null) 
    { 
    //add child2 at 2 
    }  
} 

を得た。しかし、私は、要素の挿入()またはAddAT()を見つけることができません。 (そして、私は子どもが何であるか知っていないので、add afetrを使うか、自分自身を使うのは難しいです。)

特定の場所に子供を追加する方法はありますか?

答えて

1

これを試してみてください:子供リストの先頭の末尾に追加し、追加とプリペンド:

foreach (var element in elementsToChange) 
{ 
    XElement lastChild = null; 
    foreach(var childName in Enumerable.Range(1, 3).Select(x => "Child" + x)) 
    { 
    var child = element.Element(childName); 
    if(child == null) 
    { 
     child = new XElement(childName); 
     if(lastChild == null) 
     element.AddFirst(child); 
     else 
     { 
     lastChild.AddAfterSelf(child); 
     } 
    } 
    lastChild = child; 
    } 
} 
+0

偉大な答え、いくつかの変更は、私が望むように動作します。他の人に答えをもっと利用可能にするために、おそらくforeachがListになるように変更してください。そうすれば、あなたはただ単に上がるだけではない要素を使うことができます。 – Andy

2

のXmlElementはチリを追加するには、2つの方法があります。真ん中に追加することはできません。

本当に必要ならば、すべての子を削除することができます(RemoveAllでも、この例では持っていない属性も削除されます)。次に、必要な順番(AppendChild)で追加します。

関連する問題