2011-07-19 93 views
0

是的,我真的會問關於用正則表達式解析XML ......這裏。解析XML-ish數據

我有一些XML-ISH數據,我需要解析它。我不能用XMLDocument或類似的東西完全做到這一點,因爲它不是正確的XML,我不確定我能否(或想要)更改格式。主要的問題是具有特殊的意義,而像這樣的標籤:

<$ something_here $> 

C#的XmlDocument的倒下對其進行解析時,我認爲其他方法也會這樣做的。我可以,用了很多的工作,上述更改爲類似

<some_special_tag><![CDATA[ something_here ]]></some_special_tag> 

但是,這是醜陋的,我真的不希望。改變這個過程非常耗時的原因是我有成百上千的XML文檔需要更改。

目前,我用正則表達式解析文檔。我只需要挑選一些特定的標籤(不是上面的標籤),它似乎在工作,但我對此感到不舒服。我在做這樣的事情在此刻:

... 

MatchCollection mc = Regex.Matches(Template, "<tagname.*?/tagname>"); // or similar 
foreach (Match m in mc) { 

    try { 

     XmlDocument xd = new XmlDocument(); 
     xd.LoadXml(m.Value); 

... 

這至少意味着我不使用正則表達式專門:)

任何人都可以想出一個更好的辦法?有沒有辦法讓XmlDocument禮貌地忽略導致它翻倒的$字符?這似乎不太可能,但我認爲我應該至少得到一些意見。

回答

2

不,沒有辦法讓XmlDocument解析不是xml的文檔,不管它看起來有多接近xml!

如果有可能,那麼我會絕對建議您將您的文件轉換爲實際的XML(或至少一些公認的文件格式)。試圖爲任何格式創建和維護一個可靠的工作分析器是相當多的工作,更不用說一種看起來沒有嚴格定義的格式。

使用some_special_tag元素來識別特殊部分似乎是一個好主意。如果需要,您可以使用不同的名稱空間以確保與文檔中的其他元素沒有衝突 - 這實際上就是xslt的工作方式(「特殊」標籤用於表示特殊的內容,例如應該替換的模板或節點)以及xml的設計支持。

另外我不明白你爲什麼需要將something_here位放在CDATA部分。所有「破解」xml的字符都可以很容易地轉義出來(例如通過編寫<作爲&lt;)。 CDATA部分通常僅在節點內容需要非常多地轉義時才使用,以至於使用CDATA部分代替時更容易且不太麻煩。

更新:關於遷移到新格式,你不能使用這兩種方法嗎?嘗試將文檔解析爲XML文檔(或者如果存在性能問題,則執行一些其他測試以快速確定文檔是否處於「舊」或「新」格式,例如檢查根元素中的版本屬性) - 如果它不起作用,則回到舊方法。

這種方式只要一切工作正常(只要沒有任何變化),用戶不需要修改他們的文檔,但是如果他們遇到問題或想要使用任何新功能,那麼解釋他們必須將他們的文檔更新爲新格式。

根據當前「分析器」的工作原理,您甚至可以提供自動執行轉換的升級實用程序(儘可能地)。

+0

我同意,爲特殊目的添加一個特殊的標籤顯然是解析方面的最佳選擇,並且在將來能夠繼續解析xml文檔。我只是非常希望我不會讓我的用戶改變他們的文檔,並且記得以新的方式編寫未來的文檔......關於CDATA,確實可能會有很多轉義,因爲「特殊「位可能會很長,甚至可能是文檔的大部分。 – Neil

+1

@Neil你不能通過提供現有的方法作爲回退來遷移嗎?查看我的更新瞭解更多詳情。 – Justin

+0

我沒有想到這一點。這聽起來像它會工作得很好。 – Neil

0

您不能在運行時將<$ something_here $>替換爲那個大的CDATA部分,然後照常加載XML文檔?