首页 > 解决方案 > 替换Java字符串中的xml特殊字符

问题描述

我们从一个来源获取 XML,然后传递给另一个实体进行进一步处理。但是,获取的 XML 在属性值中包含特殊字符,这些字符对于下一个过程是不可接受的。例如

样本输入:

"<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>"

预期输出:

"<Message text="&lt;html&gt;Welcome User, &lt;br&gt; Happy to have you. &lt;br&gt;.&lt;/html&gt;">

样本输入:<Message text="<html>Welcome User, <br> Happy to have you. </html>" Multi="false"> <Meta source="system" dest="any"></Meta></Message>

输出:<Message text="&lt;html&gt;Welcome User, &lt;br&gt; Happy to have you. &lt;/html&gt;" Multi="false"> <Meta source="system" dest="any"></Meta></Message>

但是如果输入有多个标签,<br>则不会被替换。<br>

我们正在使用以下代码:

String xml = "<Message text=\"<html>Welcome User, <br> Happy to have you. <br>.</html>\" Multi=\"false\"><Meta source=\"system\" dest=\"any\"></Meta></Message>";
System.out.println("ORG:" + xml);
xml = replaceChars(xml);
System.out.println("NEW:" + xml);

private static String replaceChars(String xml)
        {
           xml = xml.replace("&", "&amp;");
           xml = xml.replaceAll("\"<([^<]*)>", "\"&lt;$1&gt;");
            xml = xml.replaceAll("</([^<]*)>\"", "&lt;/$1&gt;\"");
            xml = xml.replaceAll("\"([^<]*)<([^<]*)>([^<]*)\"", "\"$1&lt;$2&gt;$3\"");

            return xml;
        }

标签: javaregexxml

解决方案


请不要使用正则表达式转义 XML 中的特殊字符。

你能保证这将适用于所有可能的 html 输入与所有 HTML 和 XML 怪癖(非常广泛的规范!!!)?

只需使用许多实用程序之一来转义 XML 字符串。

Apache Commons 非常流行——请看这个例子


推荐阅读