2012-06-20 109 views
-1

我試圖用C#.NET 4.0中的重複根元素以編程方式清理無效的XML。我想要做的是所有的內部元素合併到一個根元素,並刪除重複的根源,使用重複的根元素解析XML

<a> 
    <b></b> 
</a> 
<a> 
    <c></c> 
</a> 

成爲

<a> 
    <b></b> 
    <c></c> 
</a> 

然而,複製根元素也可以出現在內部XML。在這種情況下,我們不希望來取代它,這樣

<a> 
    <a></a> 
    <b></b> 
</a> 
<a> 
    <c></c> 
    <a></a> 
</a> 

成爲

<a> 
    <a></a> 
    <b></b> 
    <c></c> 
    <a></a> 
</a> 

而且,複製根元素是不能保證總是<a>;它可以有任何名字。

到目前爲止,我一直試圖想出一些優雅的正則表達式來完成這項任務,如/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/,但與此相關的問題是內部XML上的貪婪匹配過多匹配,並且非貪婪內部XML匹配匹配太少。

我希望我不必訴諸創建一個堆棧來計算打開和關閉標記,以確定我何時回到文檔的根目錄。我正在尋找解決此問題的簡單而優雅的方法。

開源的第三方庫是潛在的可接受的解決方案,如果其中一個處理這種情況,但我寧願避免它們。

有沒有人有任何想法?

回答

5

將XML實際讀取爲XML可能會更好......您應該可以創建設置爲Fragment的ConformanceLevel的閱讀器,並將所有片段作爲普通XML讀取。而不是使用普通的XML處理來選擇/複製Xml節點。

+0

啊!這個答案揭示了我在.NET中處理XML時的無知。我不知道有一種方法可以自動分析不符合規範的XML。謝謝! –

0

有人有一個很好的答案,他們剛剛刪除。獲取根節點的名稱,並刪除所有這些節點。不管它是什麼,應該很容易獲得第一個節點的名稱。

這將使文檔基本上保持您想要的狀態,然後將所有內容都包裝在其中一個節點中。完成。