1

以前、「javax.xml.bind.Unmarshaller」からこのメソッドを使用してドキュメントをアンマーシャリングしました (Moxy を jaxb プロバイダーとして使用しています)。

<Object> JAXBElement<Object> javax.xml.bind.Unmarshaller.unmarshal(Source source, Class<Object> declaredType) throws JAXBException

ここで、コードをリファクタリングして使用する必要があります

<?> JAXBElement<?> javax.xml.bind.Unmarshaller.unmarshal(Node node, Class<?> declaredType) throws JAXBException

問題は、非整列化例外が発生することです:

    Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: org.xml.sax.SAXParseExceptionpublicId: ; systemId: ; lineNumber: 0; columnNumber: 0; cvc-elt.1: Cannot find the declaration of element 'invoice:request'.]

Document と Document.getDocumentElement() で非整列化を試みました。ドキュメント内のデータは、InputStream 内と同じです。ドキュメントは次のように作成されます。

    protected static Document extractDocument(InputStream sourceData) {
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    Document doc;
    try {
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        doc = docBuilder.parse(new InputSource(sourceData));
    } catch (Exception e) {
        throw new IllegalArgumentException("Problem on reading xml, cause: ", e);
    }
    return doc;
}

型認識を行うため、または非整列化の 2 番目の引数を取得するために、「中間」ドキュメントが必要です。

ノード/ドキュメントで非整列化メソッドを使用して、結果が入力ストリームで使用されたものと同じになる方法は?

リックの編集

ここから xml データをアンマーシャリングしていますxsds はこの zipにあり、例はhereです。

簡単なテストを書きました(jaxbプロバイダーはmoxyで、バインディングクラスの生成にも使用されました):

    @Test
public void test() throws Exception {
    Unmarshaller um;
    JAXBContext jaxbContext = JAXBContext
            .newInstance("....generatedClasses.invoice.general430.request");
    um = jaxbContext.createUnmarshaller();

    InputStream xmlIs = SingleTests.class.getResourceAsStream("/430_requests/dentist_ersred_TG_430.xml");

    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(this.getClass().getResource("/xsd/" + "generalInvoiceRequest_430.xsd"));
    // start
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    Document doc;
    try {
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        doc = docBuilder.parse(new InputSource(xmlIs));
    } catch (Exception e) {
        throw new Exception("Problem on recognizing invoice type of given xml, cause: ", e);
    }
    // end
    um.setSchema(schema);
    um.unmarshal(doc, ....generatedClasses.invoice.general430.request.RequestType.class);

}

これは、上記のエラーでは機能しません。しかし、「開始終了ブロック」を削除し、ストリーム xmlIs を (ドキュメントを使用せずに) 直接アンマーシャリングするとすぐに、コードは機能します。

4

2 に答える 2

3

次のコードは、単純なテスト モデルで機能し、3 つのケースすべてで同じ結果が得られます。

    JAXBContext ctx = JAXBContext.newInstance(new Class[] { TestObject.class }, null);

    Source source = new StreamSource("src/stack16038604/instance.xml");
    JAXBElement o1 = ctx.createUnmarshaller().unmarshal(source, TestObject.class);
    System.out.println(o1.getValue());

    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    InputStream inputStream2 = ClassLoader.getSystemResourceAsStream("stack16038604/instance.xml");
    Document node = builderFactory.newDocumentBuilder().parse(inputStream2);
    JAXBElement o2 = ctx.createUnmarshaller().unmarshal(node, TestObject.class);
    System.out.println(o2.getValue());

    DocumentBuilderFactory builderFactory2 = DocumentBuilderFactory.newInstance();
    InputStream inputStream3 = ClassLoader.getSystemResourceAsStream("stack16038604/instance.xml");
    InputSource inputSource = new InputSource(inputStream3);
    Document node2 = builderFactory2.newDocumentBuilder().parse(inputSource);
    JAXBElement o3 = ctx.createUnmarshaller().unmarshal(node2, TestObject.class);
    System.out.println(o3.getValue());

Source ユースケースで systemId を提供した場合は、作成する InputSource で同じ systemId を使用する必要があります。

inputSource.setSystemId(sameIdAsYouUsedForSource);

それでも問題が解決しない場合は、非整列化しようとしている XML を投稿していただけますか? また、有用な情報を提供できる XML スキーマから JAXB オブジェクトが生成された場合も同様です。

お役に立てれば、

リック

于 2013-04-16T17:20:04.840 に答える