2017-08-25 89 views
-2

我有一個服務爲我填充空的XML文檔。但是,因爲在該文檔中元素內容是空的,所以這些元素標籤以縮寫形式寫入。爲了能夠填寫值,我必須將標籤擴展到開始標籤和結束標籤。是否有可能通過regulax表達替換來做到這一點?如何用正則表達式替換來擴展XML標籤

+0

什麼語言/程序是你在工作? - 可以幫助正則表達式,但不需要更多信息 –

+0

我正在將它用於SOAP UI中的XML消息。 –

+0

你應該在xml或html上使用正則表達式。有更好的方法使用xml和html類。 Xml和Html不正規,用正則表達式要困難得多。 Xml Linq通常很容易添加標籤,刪除標籤和修改值。 – jdweng

回答

1

我用下面的正則表達式來檢測壓實XML元素,並且在膨脹的版本替換它們:

<([^\s>]+)([^<>]*)(\/>) 

而更換模板看起來是這樣的:

<$1$2></$1> 

的機制是相當straigtforward 。第一組([^ \ s>] +)檢測到XML元素名稱。第二組([^ <> *)檢測到所有屬性和名稱空間(如果適用)並且最後一組檢測到壓縮元素的結束標記。

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 

翻譯成:

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod> 
+0

好的和簡單的解決方案 –

-1

是的。有可能的。

使用此正則表達式搜索:

<(.*)\/> 

而這正則表達式來代替:

<$1><\/$1> 
+0

這不起作用:這將匹配第一次打開'<'和最後一次'/>'之間的所有內容 –

+0

在我的用例中,每行只有一個標籤,所以我沒有遇到這個問題。 –

+0

ahh - 當提問一個問題時,如果包含一些源代碼會很有幫助,這樣我們就可以看到你在做什麼 - 特別是在幫助編寫正則表達式的情況下。 –

1

雖然你的答案是正確的差不多,它沒有考慮幾種可能性。

首先,如果所有的元素都沒有被新線分離,那麼你的正則表達式匹配整條生產線,到counterract這一點,它需要發懶,L像這樣:

<(.*?)\/> 

這意味着它將匹配<和/>

之間最短的表達然後,我們有它將匹配任何數量的正常元件的問題,其次是一個空的一種,例如:

<test1></test1></test2/> 

因爲它仍然匹配的第一個<和下/>

所以我們需要使用負前瞻,所以它只匹配不包含其他>元素之間的一切 - 就像這樣:

<((.(?!>))*?)\/> 

那麼你的第一個捕獲組還應該包含您希望與

<$1><\/$1> 

警告更換元素的名稱:如果任何元素包含屬性,那麼他們將被列入我結束標記,這也不起作用。

+0

哦 - 也匹配所有'。'不需要在負面視圖被加入後變得懶惰,所以<((.(?!>))*)\ />應該足夠了 –