web-dev-qa-db-ja.com

org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR:ノードは、それを作成した文書とは異なる文書で使用されています

次のような要素を生成しようとするとエラーが発生します

<hold/>

Java Axis2によって生成されたクライアントコードの使用Javaスニペット

HoldPayment hold = new HoldPayment()
cr.setHold(hold);

しかし、それを発射すると、WRONG_DOCUMENT_ERRのエラーが発生します。起動されるメッセージにこの要素を含めない場合、正常に機能します。誰もそれを修正する方法を知っていますか?

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.Apache.org/axis/}stackTrace:org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
        at com.Sun.org.Apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.Java:352)
        at com.Sun.org.Apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.Java:284)
        at com.Sun.org.Apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.Java:235)
        at org.Apache.axis.message.SOAPFaultBuilder.onEndChild(SOAPFaultBuilder.Java:305)
        at org.Apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.Java:1090)
        at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.Java:601)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.Java:1774)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.Java:2930)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.Java:648)
        at com.Sun.org.Apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.Java:140)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.Java:510)
        at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:807)
        at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:737)
        at com.Sun.org.Apache.xerces.internal.parsers.XMLParser.parse(XMLParser.Java:107)
        at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.Java:1205)
        at com.Sun.org.Apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.Java:522)
        at javax.xml.parsers.SAXParser.parse(SAXParser.Java:395)
        at org.Apache.axis.encoding.DeserializationContext.parse(DeserializationContext.Java:227)
        at org.Apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.Java:696)
        at org.Apache.axis.Message.getSOAPEnvelope(Message.Java:435)
        at org.Apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.Java:796)
        at org.Apache.axis.transport.http.HTTPSender.invoke(HTTPSender.Java:144)
        at org.Apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.Java:32)
        at org.Apache.axis.SimpleChain.doVisiting(SimpleChain.Java:118)
        at org.Apache.axis.SimpleChain.invoke(SimpleChain.Java:83)
        at org.Apache.axis.client.AxisClient.invoke(AxisClient.Java:165)
        at org.Apache.axis.client.Call.invokeEngine(Call.Java:2784)
        at org.Apache.axis.client.Call.invoke(Call.Java:2767)
        at org.Apache.axis.client.Call.invoke(Call.Java:2443)
        at org.Apache.axis.client.Call.invoke(Call.Java:2366)
        at org.Apache.axis.client.Call.invoke(Call.Java:1812)
        at au.com.virginblue.www.schema._2005._02.booking_wsdl.BookingBindingStub.createReservation(BookingBindingStub.Java:1803)
        at com.test.GetDJBooking.main(GetDJBooking.Java:215)

        {http://xml.Apache.org/axis/}hostname:test.com.au

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
        at org.Apache.axis.AxisFault.makeFault(AxisFault.Java:101)
        at org.Apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.Java:701)
        at org.Apache.axis.Message.getSOAPEnvelope(Message.Java:435)
        at org.Apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.Java:796)
        at org.Apache.axis.transport.http.HTTPSender.invoke(HTTPSender.Java:144)
        at org.Apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.Java:32)
        at org.Apache.axis.SimpleChain.doVisiting(SimpleChain.Java:118)
        at org.Apache.axis.SimpleChain.invoke(SimpleChain.Java:83)
        at org.Apache.axis.client.AxisClient.invoke(AxisClient.Java:165)
        at org.Apache.axis.client.Call.invokeEngine(Call.Java:2784)
        at org.Apache.axis.client.Call.invoke(Call.Java:2767)
        at org.Apache.axis.client.Call.invoke(Call.Java:2443)
        at org.Apache.axis.client.Call.invoke(Call.Java:2366)
        at org.Apache.axis.client.Call.invoke(Call.Java:1812)
        at au.com.virginblue.www.schema._2005._02.booking_wsdl.BookingBindingStub.createReservation(BookingBindingStub.Java:1803)
        at com.nhh.dj.GetDJBooking.main(GetDJBooking.Java:215)
Caused by: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
        at com.Sun.org.Apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.Java:352)
        at com.Sun.org.Apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.Java:284)
        at com.Sun.org.Apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.Java:235)
        at org.Apache.axis.message.SOAPFaultBuilder.onEndChild(SOAPFaultBuilder.Java:305)
        at org.Apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.Java:1090)
        at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.Java:601)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.Java:1774)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.Java:2930)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.Java:648)
        at com.Sun.org.Apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.Java:140)
        at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.Java:510)
        at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:807)
        at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:737)
        at com.Sun.org.Apache.xerces.internal.parsers.XMLParser.parse(XMLParser.Java:107)
        at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.Java:1205)
        at com.Sun.org.Apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.Java:522)
        at javax.xml.parsers.SAXParser.parse(SAXParser.Java:395)
        at org.Apache.axis.encoding.DeserializationContext.parse(DeserializationContext.Java:227)
        at org.Apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.Java:696)
        ... 14 more
40
yurl

この実装を使用して、あるXMLドキュメントから別のXMLドキュメントにNodeを追加します。

Node firstDocImportedNode = firstDoc.importNode(secondDocsNode, true);
firstDocNode.appendChild(firstDocImportedNode );

これが役立つかどうかを確認してください。 Trickは、直接追加するのではなく、Nodeを他のドキュメントにインポートするだけです。

87
Sudheer Palyam

このエラーは、CXFでメッセージSOAP=を送信したときに見られました。

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
at org.Apache.xerces.dom.ParentNode.internalInsertBefore(ParentNode.Java:351)
at org.Apache.xerces.dom.ParentNode.insertBefore(ParentNode.Java:283)
at org.Apache.xerces.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.Java:393)
at org.Apache.xerces.dom.NodeImpl.appendChild(NodeImpl.Java:236)
at org.jboss.ws.core.soap.SOAPDocument.appendChild(SOAPDocument.Java:226)
at org.jboss.ws.core.soap.SOAPPartImpl.appendChild(SOAPPartImpl.Java:300)
at org.Apache.cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.Java:119) [cxf-common-utilities-2.5.4.jar:2.5.4]
at org.Apache.cxf.staxutils.W3CDOMStreamWriter.newChild(W3CDOMStreamWriter.Java:109) [cxf-common-utilities-2.5.4.jar:2.5.4]
at org.Apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.Java:137) [cxf-common-utilities-2.5.4.jar:2.5.4]
at org.Apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.Java:122) [cxf-rt-bindings-soap-2.4.6.jar:2.4.6]

SoapOutInterceptorの前に処理されたSAAJOutInterceptorにエラーがありました。 Saaj実装はJBossからでした。そして、別のクラスローダーでドキュメントを作成します。 Saajからのこの文書はSoapOutInterceptorを破壊します。

この問題を解決して、モジュールに依存関係を追加しました。

<dependency>
    <groupId>com.Sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.3</version>
</dependency>
4
Qwertovsky

あるドキュメントからノードをコピーして、別のドキュメントに貼り付けることはできません。そうしようとすると、このタイプのエラーが発生します。

ノードを適切にインポートする必要があります。よく覚えていれば、Documentクラスはこの一般的なタスクに適したメソッドを提供します。

[〜#〜] edit [〜#〜]

問題は、setHoldメソッドの背後にあるコードにある可能性があります。要素はimportedでなければなりません。これがすべて自動生成されたコードである場合、新しいバージョンの軸を探すことで問題を解決できます。軸1.3/1.4の問題について言及した私のコメントを参照してください。

2
Andreas_D