2017-06-19 37 views
0

我有一个XElements的集合,我得到像doc.Root.Element("Doc").Elements("PersonalData")与另一个XElement包装XElement

集看起来像这样:

<PersonalData att1="0" att2="21" att3="2017"> 
     <element1> 
      <data name="test test test" /> 
     </element1> 
     <element2> 
      <element3 att1="66725.67" att2="51769.82" > 
      <data att1="03" att2="HP"/> 
      <data att1="03" att2="HP"/> 
      <data att1="03" att2="HP"/> 
      </element3> 
     </element2> 
</PersonalData > 
     <PersonalData att1="0" att2="21" att3="2017"> 
     <element1> 
      <data name="test test test" /> 
     </element1> 
     <element2> 
      <element3 att1="66725.67" att2="51769.82" > 
      <data att1="03" att2="HP"/> 
      <data att1="03" att2="HP"/> 
      <data att1="03" att2="HP"/> 
      </element3> 
     </element2> 
</PersonalData > 

我想包围集合每个元素与<row>元素。

我一直试图做这样的:

foreach (var item in doc.Root.Element("Doc").Elements("PersonalData")) 
      { 
       item.AddBeforeSelf("<row>"); 
       item.AddAfterSelf("</row>"); 
      } 

但除了"<"我得到&lt &gt。 我可以以某种方式解决这个问题或者我可以这样做:

item.ReplaceWith(new XElement("row").Add(item)); 

我怎样才能做到这正常吗?

在到底应该是这样的:

<row> 
<PersonalData att1="0" att2="21" att3="2017"> 
      <element1> 
       <data name="test test test" /> 
      </element1> 
      <element2> 
       <element3 att1="66725.67" att2="51769.82" > 
       <data att1="03" att2="HP"/> 
       <data att1="03" att2="HP"/> 
       <data att1="03" att2="HP"/> 
       </element3> 
      </element2> 
    </PersonalData > 
</row> 
<row> 
<PersonalData att1="0" att2="21" att3="2017"> 
      <element1> 
       <data name="test test test" /> 
      </element1> 
      <element2> 
       <element3 att1="66725.67" att2="51769.82" > 
       <data att1="03" att2="HP"/> 
       <data att1="03" att2="HP"/> 
       <data att1="03" att2="HP"/> 
       </element3> 
      </element2> 
    </PersonalData > 
</row> 

回答

1

那你是怎么做的不是。在使用System.Linq.Xml时,不应该直接操作XML。

  • 创建列表elementsToDelete

  • 在你的循环,每一个项目添加到这个列表,并添加一个新的XElement(项目)项的父:

    从我的头顶算法元素

  • 循环后,做elementsToDelete一个新的循环,并从您项目的父元素删除其包含的所有元素

这应该是这样的代码:

var elementsToDelete = new List<XElement>(); 
var parentElement = doc.Root.Element("Doc"); 
foreach (var item in parentElement.Elements("PersonalData")) 
{ 
    elementsToDelete.Add(item); 
} 

foreach (var element in elementsToDelete) 
{ 
    element.Remove(); 
    parentElement.Add(new XElement("row", element)); 
} 
1

可以使用ReplaceWith(),你只需要收集的元素被事先更换,因为你不能在枚举文档的元素,而你正在积极修改它。把它们扔进列表通常就足够了。

foreach (var pd in doc.Descendants("PersonalData").ToList()) 
    pd.ReplaceWith(new XElement("row", pd));