2017-06-19 38 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));