[英]Replacing characters in a non well-formed XML body
在我正在使用的(Java)代碼中,有時會處理格式不正確的XML(表示為Java String
),例如:
<root>
<foo>
bar & baz < quux
</foo>
</root>
由於最終將需要對XML進行解組(使用JAXB),因此,顯然,這種XML會在解組時引發異常。
將&
和<
替換為其字符實體的最佳方法是什么? 對於&
,就像:
xml.replaceAll("&", "&")
然而,對於<
符號,這是一個有點棘手,因為很明顯,我不想更換<
多數民眾贊成用於XML標簽開放“支架”。
除了掃描字符串並將XML正文中的<
手動替換為<
,您還能建議什么其他選擇?
坦白地說,修復格式錯誤的XML的最佳方法是將其發送回給產生它的任何人,並要求他們向您發送格式正確的XML。 您展示了一個簡單的示例,該示例可能有解決方案,但是修復格式錯誤的XML的常規方法將是一項艱巨的工作。
而且由於不需要XML解析器來處理格式錯誤的XML,所以您的解析器也不需要。 只是不要這樣做。
我想您需要更多高級邏輯。 最好首先使用“(<[^>] +>)之類的正則表達式定位所有實標簽,並且僅替換那些匹配項之外的文本,但是顯然您將無法使用replaceAll方法。 這將是一項艱巨的工作...
雖然它是一個老帖子,但我認為它可能會對其他人有所幫助。.我有相同的要求/問題,我可以使用以下代碼來解決。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class XMLTest {
/**
* @param args
*/
public static void main(String[] args) {
String xml = "<xml><body>" +
"<message>something < between <<< somthing </message>" +
"<text> testing >> > testing </text>" +
"</body></xml>";
Pattern replaceGTPattern = Pattern.compile(">[^<](.[^<]*)(>)+");
Matcher m = replaceGTPattern.matcher(xml);
String replacement;
StringBuffer intermXml = new StringBuffer();
while(m.find()){
replacement = ">"+m.group(0).substring(1).replaceAll(">", ";>");
m.appendReplacement(intermXml,replacement);
}
m.appendTail(intermXml);
Pattern replaceLTPattern = Pattern.compile("<(.[^>]*)(<)+");
m = replaceLTPattern.matcher(intermXml);
StringBuffer finalXml = new StringBuffer();
while(m.find()){
replacement = m.group(0).substring(0,m.group(0).length()-1).replaceAll("<", ";<").concat("<");
m.appendReplacement(finalXml,replacement);
}
m.appendTail(finalXml);
System.out.println(finalXml);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.