簡體   English   中英

替換格式不正確的XML正文中的字符

[英]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("&", "&amp;")

然而,對於<符號,這是一個有點棘手,因為很明顯,我不想更換<多數民眾贊成用於XML標簽開放“支架”。

除了掃描字符串並將XML正文中的<手動替換為&lt; ,您還能建議什么其他選擇?

坦白地說,修復格式錯誤的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(">", ";&gt");


    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("<", ";&lt").concat("<");


    m.appendReplacement(finalXml,replacement);


    }

    m.appendTail(finalXml);

    System.out.println(finalXml);

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM