【问题标题】:XmlBeans error: unexpected element CDATA when parsing StringXmlBeans 错误:解析字符串时出现意外元素 CDATA
【发布时间】:2013-05-19 21:38:46
【问题描述】:

我在使用 XmlBeans 解析 xml 字符串时遇到问题。问题本身出在 J2EE 应用程序中,其中字符串本身是从外部系统接收的,但我在一个小型测试项目中复制了该问题。

我找到的唯一解决方案是让 XmlBeans 解析文件而不是字符串,但这不是 J2EE 应用程序中的选项。另外,我真的很想知道到底是什么问题,因为我想解决它。

测试类来源:

public class TestXmlSpy {

    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(new FileInputStream("d:\\temp\\IE734.xml"),"UTF-8");
        BufferedReader r = new BufferedReader(reader);
        String xml = "";
        String str;

        while ((str = r.readLine()) != null) {
            xml = xml + str;
        }
        xml = xml.trim();
        System.out.println("Ready reading XML");
        XmlOptions options = new XmlOptions();
        options.setCharacterEncoding("UTF-8");

        try {
            XmlObject xmlObject = XmlObject.Factory.parse(new File("D:\\temp\\IE734.xml"), options);
            System.out.println("Ready parsing File");
            XmlObject.Factory.parse(xml, options);
            System.out.println("Ready parsing String");
        } catch (XmlException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}

XML 文件完美地验证了 XSD 的 im 使用情况。此外,将其解析为 File 对象也可以正常工作,并为我提供了一个解析的 XmlObject 来使用。但是,解析 xml-String 会给出下面的堆栈跟踪。我已经在调试器中检查了字符串本身,乍一看并没有发现它有什么问题,尤其是在第 1 行第 1 列,我认为如果我正确解释错误,Sax 解析器会出现问题.

堆栈跟踪:

Ready reading XML
Ready parsing File
org.apache.xmlbeans.XmlException: error: Unexpected element: CDATA
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3511)
    at org.apache.xmlbeans.impl.store.Locale.parse(Locale.java:713)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:697)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:684)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:208)
    at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:658)
    at xmlspy.TestXmlSpy.main(TestXmlSpy.java:37)
Caused by: org.xml.sax.SAXParseException; systemId: file:; lineNumber: 1; columnNumber: 1; Unexpected element: CDATA
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportFatalError(Piccolo.java:1038)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:723)
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3479)
    ... 6 more

【问题讨论】:

  • 不确定这是否会有所帮助,但请尝试在解析之前对选项对象调用 setLoadStripComments()。我认为解析器对评论大发雷霆
  • 您确定要使用正确的编码将文件读入强文件吗?基于文件的阅读器将应用自动编码检测,而 BufferedReader 使用的默认编码可能对文件无效。
  • 另外,您能否添加正在解析的导致此失败的 xml 字符串?
  • setLoadStripComments() 没有帮助。字符串很可能有问题,但我看不出是什么。即使我解决了它,我也需要找出如何将字符串转换为“工作”字符串,因为在实际应用程序中我需要使用它,字符串是从外部系统传递的,所以我自己无法在那里读取文件。
  • @AndrewBarber 你的意思是编辑吗?这个问题没有重新标记。 J2EE 到 Java EE 是因为“J2EE”一词自 2007 年初以来已被弃用。SO 本身也会自动重命名“J2EE”标签。在新问题上使用“J2EE”并不少见会导致许多用户说它已经过时并且不应该使用。对于这个问题,恕我直言,很清楚用户的意思是 Java EE 而不是 J2EE。那么为什么你认为 J2EE 在这里更好呢?我错过了什么吗?

标签: java xmlbeans


【解决方案1】:

这是一个编码问题,我使用了以下代码:

        File xmlFile = new File("./data/file.xml");
        FileDocument fileDoc = FileDocument.Factory.parse(xmlFile);

【讨论】:

    【解决方案2】:

    异常是由 XML 文件的长度引起的。如果在文件中添加或删除一个字符,解析器就会成功。

    问题出现在 XMLBeans 所依赖的第 3 方 PiccoloLexer 库中。它已在修订版 959082 中修复,但尚未应用于 xbean 2.5 jar。

    What does the org.apache.xmlbeans.XmlException with a message of “Unexpected element: CDATA” mean?

    XMLBeans - Problem with XML files if length is exactly 8193bytes

    Issue reported on XMLBean Jira

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2012-06-27
      • 1970-01-01
      • 2020-06-08
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多