4

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
4

2 に答える 2

2

これはエンコーディングの問題です。私のために働いた以下のコードを使用しました:

        File xmlFile = new File("./data/file.xml");
        FileDocument fileDoc = FileDocument.Factory.parse(xmlFile);
于 2013-09-10T05:57:36.597 に答える
2

例外は、XML ファイルの長さが原因で発生します。ファイルから 1 文字を追加または削除すると、パーサーは成功します。

この問題は、XMLBeans が依存するサード パーティの PiccoloLexer ライブラリ内で発生します。リビジョン 959082 で修正されていますが、xbean 2.5 jar には適用されていません。

「予期しない要素: CDATA」というメッセージが表示される org.apache.xmlbeans.XmlException は何を意味しますか?

XMLBeans - 長さが正確に 8193 バイトである場合の XML ファイルの問題

XMLBean Jira で報告された問題

于 2014-06-23T10:54:02.050 に答える