解决过程:
提取导入数据包中的一条完整数据做调试。
根据报错提示查看XF_SUMMARY标签元素是否真正缺少闭合标签,目测没问题
源文件:
<XF_SUMMARY>XXXX相关信息</XF_SUMMARY>
还是报错换成其他的标签元素信息:
2014-07-2213:31:41错误[con.err]org.dom4j.DocumentException:Erroronline36ofdocument:Theelementtype"APPELLEE_POLITY"mustbeterminatedbythematchingend-tag"</APPELLEE_POLITY>".Nestedexception:Theelementtype"APPELLEE_POLITY"mustbeterminatedbythematchingend-tag"</APPELLEE_POLITY>". 2014-07-2213:31:41错误[con.err]atorg.dom4j.io.SAXReader.read(SAXReader.java:482) 2014-07-2213:31:41错误[con.err]atorg.dom4j.io.SAXReader.read(SAXReader.java:343)
原因是什么?看上去完好的标签为什么在解析的时候会提示缺少闭合标签呢?
publicstaticDocumentchangerXMLCode(FilexmlFile)throwsIOException,DocumentException{ SAXReaderreader=newSAXReader(); FileInputStreamfileInputStream=newFileInputStream(xmlFile); byte[]b0=newbyte[1024]; byte[]B=newbyte[0]; intread=-1; while((read=fileInputStream.read(b0))>-1){ inti=B.length; B=Arrays.copyOf(B,B.length+read); for(intj=0;j<read;j++){ B[i+j]=b0[j]; } } StringxmlDate=newString(B,"GBK");//我们的XML文件编码为GBK xmlDate=xmlDate.replaceAll("&#[1-9]+|&#\\w{0,3};?",""); //将字符串转换为Document对象 Documentdocument=reader.read(newByteArrayInputStream(xmlDate .getBytes("GBK"))); returndocument; }
通过查看xmlDate的值我们知道了原来是:
<?xmlversion="1.0"encoding="GBK"?><XF_JUBAO> <Jubao> <APPELLEE_SEX>鐢?/APPELLEE_SEX> <APPELLEE_NATION>姹夋棌</APPELLEE_NATION> <APPELLEE_POLITY>涓浗鍏变骇鍏氬厷鍛?/APPELLEE_POLITY> <XF_QUESTIONTYPE>宸ㄩ璐骇鏉ユ簮涓嶆槑</XF_QUESTIONTYPE> <APPELLEE_NAME>鐜嬪繝</APPELLEE_NAME> <APPELLEE_ADDR>娉板窞甯傚叴鍖栧競宸ュ晢閾惰</APPELLEE_ADDR> </Jubao> </XF_JUBAO>
的确有的闭合标签元素被乱码给破坏了如:
<APPELLEE_POLITY>涓浗鍏变骇鍏氬厷鍛?/APPELLEE_POLITY>
最后确定问题原因:导出xml数据包时,没有设置编码为GBK。
继续做个调试,将解析代码调整为utf-8格式
publicstaticDocumentchangerXMLCode(FilexmlFile)throwsIOException,"utf-8");//修改为utf-8 xmlDate=xmlDate.replaceAll("&#[1-9]+|&#\\w{0,""); //将字符串转换为Document对象 Documentdocument=reader.read(newByteArrayInputStream(xmlDate .getBytes("utf-8")));//修改为utf-8 returndocument; }
继续导入数据包,查看xmlDate数据是:
<?xmlversion="1.0"encoding="GBK"?> <XF_JUBAO> <Jubao> <APPELLEE_SEX>男</APPELLEE_SEX> <APPELLEE_NATION>汉族</APPELLEE_NATION> <APPELLEE_POLITY>职级<//APPELLEE_POLITY> <XF_QUESTIONTYPE>问题</XF_QUESTIONTYPE> <APPELLEE_NAME>名称</APPELLEE_NAME> <APPELLEE_ADDR>地址</APPELLEE_ADDR> </Jubao> </XF_JUBAO>
一切显示都正常了,但是莫名其妙又报错了。还是之前的错误信息:
2014-07-2213:52:01错误[con.err]org.dom4j.DocumentException:Erroronline36ofdocument:Theelementtype"APPELLEE_POLITY"mustbeterminatedbythematchingend-tag"</APPELLEE_POLITY>".Nestedexception:Theelementtype"APPELLEE_POLITY"mustbeterminatedbythematchingend-tag"</APPELLEE_POLITY>". 2014-07-2213:52:01错误[con.err]atorg.dom4j.io.SAXReader.read(SAXReader.java:482) 2014-07-2213:52:01错误[con.err]atorg.dom4j.io.SAXReader.read(SAXReader.java:343)
为什么呢?原来继续调试问题又绕回来了
因为XML已经指定了gbk编码格式:
<?xmlversion="1.0"encoding="GBK"?>
将该格式统一改成utf-8解析就哦了。