web-dev-qa-db-fra.com

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: un nœud est utilisé dans un document différent de celui qui l'a créé

Je reçois une erreur lorsque j'essaie de générer un élément qui devrait ressembler à

<hold/>

Utilisation du code client Java généré par Axis2. Java

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

mais lorsque je le déclenche, j'obtiens une erreur de WRONG_DOCUMENT_ERR. Si je n'inclus pas cet élément dans le message renvoyé, cela fonctionne très bien. quelqu'un a une idée de comment le réparer?

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

J'utilise cette implémentation pour ajouter Node d'un document XML à un autre.

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

Voyez si cela aide. L'astuce consiste simplement à importer un Node vers un autre document, au lieu de l'ajouter directement.

87
Sudheer Palyam

Nous avons vu cette erreur lors de l'envoi d'un message SOAP avec CXF.

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]

L'erreur était dans SAAJOutInterceptor qui a été traité avant SoapOutInterceptor. L'implémentation de Saaj provenait de JBoss. Et il crée un document avec un autre chargeur de classe. Ce document de Saaj casse SoapOutInterceptor.

Nous avons résolu ce problème en ajoutant des dépendances à notre module.

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

Vous ne pouvez pas copier un nœud d'un document et le coller dans un autre. Une tentative dans ce sens entraîne ce type d'erreur.

Le nœud doit être correctement importé. Si je me souviens bien, la classe Document propose les bonnes méthodes pour cette tâche courante.

MODIFIER

Le problème pourrait être dans le code derrière la méthode setHold. L'élément doit être importé . S'il s'agit uniquement de code généré automatiquement, la recherche d'une version plus récente de l'axe pourrait résoudre le problème. Voir mon commentaire, où j'ai mentionné un problème d'axe 1.3/1.4.

2
Andreas_D