以前、「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 を (ドキュメントを使用せずに) 直接アンマーシャリングするとすぐに、コードは機能します。