我在使用 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