替换Java字符串中的xml特殊字符

时间:2018-07-05 11:24:43

标签: java regex 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;
        }

3 个答案:

答案 0 :(得分:1)

要匹配,您可以使用正则表达式:

(?:<)

  • <匹配但未捕获(?<=<)
  • <(\/?\w*)的积极期待。
  • /捕获标签名称。可选的(?=.*(?<=<\/html))和单词字符。
  • (?:>)正向先行,然后向后反向向后关闭标签。
  • >匹配但未捕获&lt;$1&gt;

要替换,您可以使用:

  • $1

public static void main(String []args){ String xml = "<Message text=\"<html>Welcome User, <br> Happy to have you. <br>.</html>\" Multi=\"false\"><Meta source=\"system\" dest=\"any\"></Meta></Message>"; String newxml = replaceChars(xml); System.out.println(newxml); } private static String replaceChars(String xml) { xml = xml.replaceAll("(?:<)(?<=<)(\/?\w*)(?=.*(?<=<\/html))(?:>)", "&lt;$1&gt;"); return xml; } 是正则表达式中捕获组的结果。 您可以以交互方式here测试正则表达式。

使用以下Java代码:

"<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>"

输出为:

<subsystem xmlns="urn:jboss:domain:undertow:3.0"> ... <server name="default-server"> ... <host name="default-host" alias="localhost"> ... <location name="/logs" handler="logs"/> ... </host> ... </server> ... <handlers> ... <file name="logs" path="/home/app/logs" directory-listing="true"/> </handlers> ... </subsystem>

答案 1 :(得分:1)

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

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

只需使用众多实用工具之一即可对XML字符串进行转义。

Apache Commons非常受欢迎-please see this example

答案 2 :(得分:1)

XML不是文本。实际上,XML文档是二进制格式

将XML作为文本处理是错误的方法,并且仅在简单情况下有效。 注意事项:

  • XML文档没有没有文件编码,但是在文档中指定了内容编码(因此必须由XML解析器读取,XML解析器可以正确处理)。< / li>
  • XML文档使用 XML实体&amp;&lt;&gt;&quot;之类的内置文件,其他可以在DDL,请参见https://www.w3resource.com/xml/entities.php)。
  • XML文档可以包含CDATA

因此:

  • 使用适当的XML解析器读取文档
  • 在DOM上执行操作(文本替换,添加/删除节点) (文档对象模型)或流模型。
  • 使用适当的XML处理器编写文档

顺便说一下,您的示例中的XML不是xml (格式错误,因为<>"没有使用任何实体)