"와 같은 태그를 저장하면 오류가 발생합니다. 내용이 많아 문제가 자주 발생합니다."/> "와 같은 태그를 저장하면 오류가 발생합니다. 내용이 많아 문제가 자주 발생합니다.">

>백엔드 개발 >XML/RSS 튜토리얼 >xml 문자열 파싱시 & < > 기호가 존재할 경우 해결방법에 대한 자세한 설명

xml 문자열 파싱시 & < > 기호가 존재할 경우 해결방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-04-01 13:37:302757검색

问题产生:

       在接口调用得出一个xml字符串,一直报错

The entityname must immediately follow the &#39;&&#39; in the entity reference

经查发现  xml的内容里存在有  &符号  而 通过dom4j读取时  会发生错误

在xml中 “&”“140e4624dfe614c0cb4364a4937e6ff2”这样的标签存放在内容里是不合法的,会经常出问题。

下面找到解决方法:实测   替换  &   是可行的。   

public void chartReplace(){
        String str2 = "<logentry revision=&#39;1&#39;>" +
                "<msg>In this comment, I fixed a <bug>, and <added> file1&&file2.</msg>" +
                "</logentry>";
        System.out.println("original string: "+str2);
         
        //替换“&”:$1表示与(<msg>.*)的匹配子序列;$4表示与(.*</msg>)匹配的。
                     //&(?!amp;)表示匹配&而且后面不是amp;的字符串
        //"$1&amp;$3$4"得到的结果就是替换了<msg></msg>中的“&”为“&amp;”
        //由于每次只能替换掉一个“&”,所以循环执行替换,直到替换后与替换前的字符串相等。
        String str1 = "";
        while(!str2.equals(str1)){
            str1 = str2;
            str2 = str1.replaceAll("(<msg>.*)(&(?!amp;))(.*</msg>)", "$1&amp;$3");
        }
        System.out.println("firstly replace \"&\": "+str2);
         
        //替换“<”
        str1 = "";
        while(!str2.equals(str1)){
            str1 = str2;
            str2 = str1.replaceAll("(<msg>.*)(<)(.*</msg>)", "$1&lt;$3");
        }
        System.out.println("then replace \"<\": "+str2);
         
        //替换“<”
        str1 = "";
        while(!str2.equals(str1)){
            str1 = str2;
            str2 = str1.replaceAll("(<msg>.*)(>)(.*</msg>)", "$1&gt;$3");
        }
        System.out.println("finally replace \">\": "+str2);
    }

위 내용은 xml 문자열 파싱시 & < > 기호가 존재할 경우 해결방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.