2012-06-17 28 views
1

如何使用C#從XML文件中刪除所有空元素?如何使用C#從xml文件中刪除所有空元素?

如:

輸入

<Person> 
    <PersonDetails> 
    <Name>Some Name</Name> 
    <Address> 
     <Street>Some Street</Street> 
     <City>Some City</City> 
     <Zip/> 
    </Address> 
</PersonDetails> 
<PersonDetails> 
    <Name>Some Name</Name> 
    <Address/> 
</PersonDetails> 
<PersonDetails/> 
</Person> 

輸出

<Person> 
    <PersonDetails> 
    <Name>Some Name</Name> 
    <Address> 
     <Street>Some Street</Street> 
     <City>Some City</City> 
    </Address> 
</PersonDetails> 
<PersonDetails> 
    <Name>Some Name</Name> 
</PersonDetails> 
</Person> 
+4

歡迎使用StackOverflow:如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)格式和語法突出顯示它!無需「破壞」您的XML,也不需要大量的'
'標籤 - 只需格式化! –

+0

@marc_s:酷,從未注意到。我總是輸入四個額外的空格,或者在發佈之前在VS2010中縮進我的代碼。 – comecme

+0

你想從內部遞歸地刪除空元素嗎?例如,如果PersonDetail中的所有元素都是空的,那麼您是否還想刪除PersonDetail元素? – user845279

回答

7

基於更新後的問題,你可以使用XPath的單行得到後,你在做什麼:

var doc = XElement.Parse(source); // or XElement.Load(filename) if coming from a file 

doc.XPathSelectElements("//*[string-length() = 0]").ToList().Remove(); 

doc.Save(filename)     // or doc.ToString() if you want the string output 

如果你不想使用XPath,您可以使用Descendants()和LINQ:

doc.Descendants().ToList().Where(d => d.Value.Length == 0).Remove(); 

ToList()在這兩種情況下是必要的,以確保您不到位修改枚舉。

+1

感謝這一個工程。但它不會刪除元素(層次結構)中的空元素。我的情況我會得到不同結構的不同xml文件。有什麼辦法可以刪除任何類型的XML結構中的空元素? – user1432798

+0

你可以通過創建一個方法很容易地適應這個答案,例如,通過所有子元素遞歸的IsElementEmpty(),直到1.耗盡子元素或2.找到一個帶有值的元素。 –

+0

@ user1432798我已經更新了答案,以便做你正在尋找的東西。 – yamen

相關問題