替换Java字符串中的xml特殊字符
我们从一个源获取XML,然后传递到另一个实体进行进一步处理。但是,获取的XML在属性值中包含下一个进程不能接受的特殊字符。 例如 样本输入:替换Java字符串中的xml特殊字符,java,regex,xml,Java,Regex,Xml,我们从一个源获取XML,然后传递到另一个实体进行进一步处理。但是,获取的XML在属性值中包含下一个进程不能接受的特殊字符。 例如 样本输入: "<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>" ”; System.out.println(“ORG:+xml”); xml=replaceChars(xml); System.out.println(
"<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>"
”;
System.out.println(“ORG:+xml”);
xml=replaceChars(xml);
System.out.println(“新:”+xml);
私有静态字符串替换字符(字符串xml)
{
xml=xml.replace(“&”、“&;”;
xml=xml.replaceAll(“\”要匹配,可以使用正则表达式:
(?:
)
要替换,您可以使用:
$1
其中,$1
是正则表达式中捕获组的结果。
可以以交互方式测试正则表达式
使用以下Java代码:
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;
}
publicstaticvoidmain(字符串[]args){
字符串xml=”“;
字符串newxml=replaceChars(xml);
System.out.println(newxml);
}
私有静态字符串替换字符(字符串xml)
{
xml=xml.replaceAll(“(?:请不要使用正则表达式来转义xml中的特殊字符
您能保证这将适用于所有可能的html输入和所有html和XML怪癖(非常广泛的规范!!!)
只需使用许多实用程序中的一个来转义XML字符串
Apache Commons非常流行-XML不是文本。事实上,XML文档是一种二进制格式
将XML作为文本处理是错误的方法,只适用于简单的情况。
需要考虑的事项:
- XML文档没有文件编码,但文档中指定了内容编码(因此必须由正确处理此问题的XML解析器读取)
- XML文档使用XML实体(内置的,如
&;
,
,
和“
,其他可以在DDL中任意定义,请参阅)
- XML文档可以包含CDATA
因此:
- 使用适当的XML解析器读取文档
- 在DOM(文档对象模型)或流模型上执行操作(文本替换、添加/删除节点)
- 使用适当的XML处理器编写文档
顺便说一下,示例中的XML不是XML(格式错误,因为没有实体用于
,“
)我们没有解析xml。我们只是想删除那些在下一阶段SAX解析器无法解析的字符。这是否回答了您的问题?部分正确。整个输出是:/Meta/Message
观察Meta
和Message
的结束标记。基本上,我们想考虑r仅限介于之间的内容。
(双引号)。@Chota好的,我明白了。请尝试(?:是的,这是更好的,但这似乎期望它总是以
结束,而事实并非如此。我们可能有一个字符串,其中只包含一些
。为您知道要匹配的标记的第二个查找添加额外的情况是很简单的,即(?)?
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;
}
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;
}