Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换Java字符串中的xml特殊字符_Java_Regex_Xml - Fatal编程技术网

替换Java字符串中的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(

我们从一个源获取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(“新:”+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))(?:>)", "&lt;$1&gt;");
       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("&", "&amp;");
           xml = xml.replaceAll("\"<([^<]*)>", "\"&lt;$1&gt;");
            xml = xml.replaceAll("</([^<]*)>\"", "&lt;/$1&gt;\"");
            xml = xml.replaceAll("\"([^<]*)<([^<]*)>([^<]*)\"", "\"$1&lt;$2&gt;$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))(?:>)", "&lt;$1&gt;");
       return xml;
    }