我们正在从一个来源获取XML,然后传递给另一个实体进行进一步处理。但是,获取的XML在属性值中包含特殊字符,这些特殊字符对于下一个过程是不可接受的。 例如
样本输入:
"<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>"
预期输出:
"<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>">
样本输入:<Message text="<html>Welcome User, <br> Happy to have you. </html>" Multi="false"> <Meta source="system" dest="any"></Meta></Message>
输出:<Message text="<html>Welcome User, <br> Happy to have you. </html>" 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("&", "&");
xml = xml.replaceAll("\"<([^<]*)>", "\"<$1>");
xml = xml.replaceAll("</([^<]*)>\"", "</$1>\"");
xml = xml.replaceAll("\"([^<]*)<([^<]*)>([^<]*)\"", "\"$1<$2>$3\"");
return xml;
}
答案 0 :(得分:1)
要匹配,您可以使用正则表达式:
(?:<)
<
匹配但未捕获(?<=<)
。<
对(\/?\w*)
的积极期待。/
捕获标签名称。可选的(?=.*(?<=<\/html))
和单词字符。(?:>)
正向先行,然后向后反向向后关闭标签。>
匹配但未捕获<$1>
。要替换,您可以使用:
$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))(?:>)", "<$1>");
return xml;
}
是正则表达式中捕获组的结果。
您可以以交互方式here测试正则表达式。
使用以下Java代码:
"<Message text="<html>Welcome User, <br> Happy to have you. </html>" 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作为文本处理是错误的方法,并且仅在简单情况下有效。 注意事项:
&
,<
,>
和"
之类的内置文件,其他可以在DDL,请参见https://www.w3resource.com/xml/entities.php)。因此:
顺便说一下,您的示例中的XML不是xml (格式错误,因为<
,>
,"
没有使用任何实体)>