2009-07-20 77 views
2

我需要刪除XML標籤之間的任何東西,尤其是空格和換行符。刪除XML標籤及其內容之間的任何東西

例如去除空白和newslines:
< /節點> \ n <節點ID = 「無所謂」 >

獲得:
< /節點> <節點ID = 「無所謂」 >

這並不意味着手工解析XML,而是在XML數據被工具解析之前準備好。更具體地說,我使用Hpricot(Ruby)來解析XML,不幸的是我們目前停留在版本0.6.164上,所以...我不知道更近的版本,但是這個經常返回奇怪的節點(對象)只包含空格和換行符。因此,這個想法是在將XML轉換爲Hpricot文檔之前清理XML。替代解決方案感激

從測試的一個例子:NoMethodError:未定義的方法`孩子們的‘\ n’:角度來說,Hpricot ::文本
這裏的有趣的部分是不是NoMethodError,因爲這只是罰款,但該角度來說,Hpricot ::文本元素只包含一個換行符,僅此而已。

回答

6

請不要使用正則表達式來解析XML。這是非常容易出錯的。

使用適當的XML庫,這將使這個微不足道。幾乎所有可以請求的編程平臺都提供了XML庫 - 對XML使用正則表達式實在沒有任何藉口。

+0

53秒! – tj111 2009-07-20 19:06:32

1

你不應該使用正則表達式來解析XML或HTML,它只是不可靠,並有方式太多的邊緣情況。您應該使用XML/HTML解析器來代替這種類型的東西。

1

請勿使用正則表達式。嘗試將XML解析爲DOM,然後從那裏操作(您使用的語言/框架是什麼?);

2

使用正則表達式解析XML通常不是一個好主意。 XML的主要優點之一是,有許多經過良好測試的解析器可用於您可能需要的任何語言/框架。 XML中有一些棘手的規則可以防止任何正則表達式能夠正確解析XML。

也就是說,類似:

s/>.*?</></gs 

(即perl的語法)可能會做你想要什麼。這表示從大於小於的任何東西,並將其剝離。最後的「g」表示根據需要多次執行替換,「s」表示「。」。匹配包括換行符在內的所有字符(否則換行符不會被包含,因此該模式需要針對每行運行一次,並且不會覆蓋跨越多行的標籤)。

6

解決方案是選擇所有「空白」文本節點並將其刪除。

doc = Nokogiri(xml_source) 
doc.xpath('//text()[not(normalize-space())]').remove 
相關問題