在java中解析时出现“非法XML字符”问题

时间:2014-03-04 19:45:54

标签: java xml sax

我有一个从db导出数据的java应用程序;操纵一些字段并将其重新加载到另一个数据库中进行测试。

应用程序使用的表中的某些字段最近被加密,之后应用程序在尝试操作导出为xml文件的数据时抛出异常。下面是堆栈跟踪

    java.lang.Exception: Error Parsing String
    at com.oocl.frm.xmlutil.xmlbeans.XmlBeansUtil.unmarshall(XmlBeansUtil.java:37)
    at com.oocl.automation.object.DataSet.<init>(DataSet.java:12)
    at com.oocl.automation.process.BaseProcess.process(BaseProcess.java:21)
    at com.oocl.automation.TestAutomation.main(TestAutomation.java:30)
Caused by: org.apache.xmlbeans.XmlException: error: Character reference to illegal XML character
org.apache.xmlbeans.impl.piccolo.io.IllegalCharException: Character reference to illegal XML character
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseEncodedChar(PiccoloLexer.java:3131)
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4899)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3435)
    at org.apache.xmlbeans.impl.store.Locale.parse(Locale.java:706)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:690)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:677)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:208)
    at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:579)
    at com.oocl.frm.xmlutil.xmlbeans.XmlBeansUtil.unmarshall(XmlBeansUtil.java:35)
    at com.oocl.automation.object.DataSet.<init>(DataSet.java:12)
    at com.oocl.automation.process.BaseProcess.process(BaseProcess.java:21)
    at com.oocl.automation.TestAutomation.main(TestAutomation.java:30)

    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3467)
    at org.apache.xmlbeans.impl.store.Locale.parse(Locale.java:706)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:690)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:677)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:208)
    at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:579)
    at com.oocl.frm.xmlutil.xmlbeans.XmlBeansUtil.unmarshall(XmlBeansUtil.java:35)
    ... 3 more
Caused by: org.xml.sax.SAXParseException; systemId: file:; lineNumber: 39313; columnNumber: 657; Character reference to illegal XML character

有什么方法可以让xml解析器处理或排除这些非法字符?我无法在任何地方找到合适的答案。

非常感谢任何帮助。

我的xml版本是 我试过1.1,但它不能正常工作。抛出异常的角色也是;&amp;#3。

2 个答案:

答案 0 :(得分:1)

您的问题似乎就在这里(第39313行,第657栏):

Caused by: org.xml.sax.SAXParseException; systemId: file:; lineNumber: 39313; columnNumber: 657; Character reference to illegal XML character

如果您的XML中有特殊字符并且之前已对其进行过解析,则它可能是XML 1.0中的非法字符(例如,在XML 1.1中可能不合法 - 请检查您的XML标题中的版本文件,或配置您的解析器在XML 1.1处理它)。

更新:我看到您的实现使用Piccolo解析器。 2007年报告了bug(但现在可能已经修复)。无论如何,它值得检查您正在使用的版本以及该错误的当前状态。在解析时,您可能需要使用不同的解析器或忽略有问题的字符。

答案 1 :(得分:1)

第一步是确定非法字符是什么以及它们被引入的原因。如果数据库软件正在导出非法的XML字符,您可能需要让供应商对其进行修复,或者您可能需要通过导出该字段的已清理版本来解决该问题。

如果您无法在源代码处理问题,请通过复制和过滤到单独的文件中预处理源XML,或者创建一个可以放在XML阅读器前面的过滤流阅读器

请注意,简单地丢弃非法字符可能会产生下游效应,因为可以对字符进行编码(例如,使用URL编码或其他方式)。