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 using に対して完全に検証されます。また、それを File オブジェクトとして解析すると問題なく動作し、解析された XmlObject を操作できるようになります。ただし、xml-String を解析すると、以下のスタック トレースが得られます。私はデバッガーで文字列自体をチェックしましたが、特にエラーを正しく解釈している場合、Sax パーサーに問題があると思われる行 1 列 1 では、一見しただけでは何も問題がありません。 .
スタックトレース:
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