1

在我正在处理的(Java)代码中,我有时会处理格式不正确的 XML(表示为 Java String),例如:

<root>
  <foo>
    bar & baz < quux
  </foo>
</root>

由于这个 XML 最终需要被解组(使用 JAXB),显然这个 XML 将在解组时抛出异常。

&将 the和 the替换<为其角色实体的最佳方法是什么?对于&,这很简单:

xml.replaceAll("&", "&amp;")

但是,对于<符号,它有点棘手,因为显然我不想替换<用于 XML 标记开头“括号”的那个。

除了扫描字符串并<在 XML 正文中手动替换为&lt;之外,您还能建议什么其他选项?

4

3 回答 3

4

坦率地说,修复格式错误的 XML 的最佳方法是将其发回给生成它的人,并要求他们向您发送格式正确的 XML。您展示了一个简单的示例,它可能有解决方案,但是修复格式错误的 XML 的通用方法将是一项可怕的工作。

而且由于不需要 XML 解析器来处理格式错误的 XML,因此您的解析器也不需要这样做。只是不要这样做。

于 2010-06-10T04:49:53.533 回答
1

我想你需要更高级的逻辑。最好先使用“(<[^>]+>)”之类的正则表达式定位所有真实标签,然后只替换那些匹配项之外的文本,但显然你将无法使用 replaceAll 方法。这将更像是一项管道工作......

于 2010-06-09T18:16:57.507 回答
1

虽然它是一个旧帖子,但我认为它可能对其他人有所帮助..我有相同的要求/问题,我可以使用以下代码解决。

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);

}
}
于 2011-02-04T11:28:58.823 回答