2013-02-25 55 views
1

我正在寫一個函數,我將用於我的單元測試。我想比較XML文件,但是由於其中一個將由第三方庫創建,因此我想通過縮進來緩解任何可能的差異。因此我寫了如下函數:刪除xml文件的縮進

private String normalizeXML(String xmlString) { 
    String res = xmlString.replaceAll("[ \t]+", " "); 
    // leading whitespaces are inconsistent in the resulting xmls. 
    res = res.replaceAll("^\\s+", ""); 
    return res.trim(); 
} 

但是這個函數並沒有刪除XML每一行的前導間隔。

當我寫在這種方式的功能(在第一正則表達式的差):

private String normalizeXMLs(String xmlString) { 
    String res = xmlString.replaceAll("\\s+", " "); 
    // leading whitespaces are inconsistent in the resulting xmls. 
    res = res.replaceAll("^\\s+", ""); 
    return res.trim(); 
} 

它刪除尾部的空白,但它也使在xml顯示爲單條線,這是非常麻煩的當你需要比較差異。

我只是不能證明爲什麼第一個實現不會取代領先區間。有任何想法嗎?

編輯:更有意思的是,如果我做一個單行操作:

String res = xmlString.replaceAll("^\\s+", ""); 

該行不會刪除任何identation的!

+0

一個問題,此方法的缺點是可能會移除空白,實際上是顯著。換行符和空格可以作爲標籤文本內的值顯示。 – Newtopian 2016-08-26 16:44:35

回答

5

而不是試圖操縱字符串表示,這將是更安全的使用專用的XML比較工具如XMLUnit,讓您準確定義哪些差異顯着,哪些不顯着。嘗試使用正則表達式修改XML數據並不是一個好主意,您應該使用一個合適的XML解析器來了解所有使得格式良好的XML的規則。

+0

感謝您提供非常合理的評論,並將我指向該圖書館。不過,我認爲我理解正則表達式。我不能讓這種無法解釋的行爲出現。 – 2013-02-25 15:27:21

+0

@BorisStrandjev在Java正則表達式中,'^'默認只匹配輸入的開頭。如果您希望它在字符串中嵌入的換行符後定位,那麼您需要啓用「多行」標誌:'replaceAll(「(?m)^ \\ s +」,「」)' – 2013-02-25 15:32:38

+0

現在,這是一個答案非常有幫助!謝謝! – 2013-02-25 15:37:11

0

可能:

String res = xmlString.replaceAll("[ \\t]+", " "); 

不\ t ...

+0

不,我真的覺得第二個正則表達式奇蹟般地停止了第一個正則表達式的工作。 – 2013-02-25 15:18:41

0

這個工作對我來說:

private static String normalizeXMLs(String xmlString) { 
    String res = xmlString.replaceAll("\\t", ""); 
    return res.trim(); 
} 

祝你好運:)