2009-08-26 79 views
1

我需要從XML文檔中去除所有xml標籤,但保留標籤佔用的空間,以便文本內容保持與在xml中。這需要用Java來完成,我認爲RegExp會成爲一種方式,但我沒有找到簡單的方法來獲得與我的正則表達式匹配的標籤長度​​。使用RegExp用空白替換XML標籤(在標籤的長度中)

基本上我想是這樣的:

Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 
Matcher m = p.matcher(stringWithXMLContent); 
String strippedContent = m.replaceAll("THIS IS A STRING OF WHITESPACES IN THE LENGTH OF THE MATCHED TAG"); 

希望有人可以幫我用簡單的方式做到這一點!

+3

爲什麼,哦,爲什麼每個人都認爲正則表達式是與角色有關的所有事情的解決方案? :( – Bombe 2009-08-26 13:41:38

+1

因爲大部分時間都是這樣,對吧?;) – jhoff 2009-08-26 13:52:32

回答

1
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 

在你的精神不能解析XML隨着正則表達式,你就知道這是不是任意的XML適當的花樣,對不對? (在屬性值中包含>字符是完全有效的,例如,更不用說其他非標記結構。)

我發現沒有簡單的方法來獲得符合我的常規標記的長度表達。

代替使用replaceAll,在匹配器上重複調用find。然後您可以讀取開始/結束以獲取要替換的索引,或在緩衝區上使用appendReplacement方法。例如。

StringBuffer b= new StringBuffer(); 
while (m.find()) { 
    String spaces= StringUtils.repeat(" ", m.end()-m.start()); 
    m.appendReplacement(b, spaces); 
} 
m.appendTail(b); 
stringWithXMLContent= b.toString(); 

(StringUtils的來自Apache的百科全書。欲瞭解更多的背景和免費的圖書館的替代品見this question。)

+0

謝謝,這正是Matcher I的功能一直在尋找! – jhoff 2009-08-26 15:02:24

4

由於<>字符總是圍繞着XML中的起始和結束標籤,所以對於簡單的狀態機來說,這可能會更簡單。簡單地遍歷所有字符(以某種可寫形式 - 未存儲在字符串中),並且如果在「替換模式」中遇到<翻轉並開始用空格替換所有字符,直到遇到>。 (請務必替換最初的<和關閉>)。

如果您關心佈局,您可能希望避免替換製表符和/或換行符。如果你關心的是整個字符串的長度,那顯然沒有關係。

編輯:如果您要支持註釋,處理指令和/或CData部分,您還需要明確識別這些註釋,同樣,不幸的是,屬性值也可以包括>;所有這些意味着一個全面的實現將會更加複雜,你會喜歡。

一個常規的傳感器將完美的完成這項任務;但不幸的是那些不完全常用的類庫中......

+1

這個基本上可以工作,但是如果你遇到一些標籤的評論,例如

+0

對不起,忽略從bobince的帖子 – 2009-08-27 13:20:41

0
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "") 

你也可以試試這個。它搜索<,然後/ 0或1發生,然後字符只有1(小或大寫字母),然後跟一個>,然後*多次出現此模式。

:)