【问题标题】:org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created itorg.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: 一个节点在与创建它的文档不同的文档中使用
【发布时间】:2011-03-12 04:29:35
【问题描述】:

当我尝试生成一个看起来应该像这样的元素时出现错误

<hold/>

使用 Axis2 生成的 java 客户端代码。 java sn-p

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

【问题讨论】:

    标签: java soap axis


    【解决方案1】:

    答案完全符合 Sudheer Palyam 的答案,并力求使他的答案更加清晰。

    在下面的示例中,我有一个在其他地方创建的节点“节点”,它是不同 XML 文档的一部分。

    其次,我有一个 NodeList,我想将其节点附加到上面提到的节点“节点”中。

    所以,我将 NodeList 中的节点一一导入到 Node 'node' 的 Document 中。 导入节点后,我将其附加到节点“节点”中。

    Document ownerDocument = node.getOwnerDocument();
    for(int count = 0; count < otherDocumentNodeChildNodes.getLength(); count++)
    {
        Node child = otherDocumentNodeChildNodes.item(count);
        Node importedNode = ownerDocument.importNode(child, true);
        node.appendChild(importedNode);
    }
    

    【讨论】:

      【解决方案2】:

      我们在使用 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>
      

      【讨论】:

        【解决方案3】:

        我使用这个实现将 Node 从一个 XML 文档添加到另一个。

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

        看看这是否有帮助。 Trick 只是将 Node 导入到其他 Document,而不是直接追加。

        【讨论】:

        • 如果 firstDoc 是您从中获取节点的文档,而 secondDoc 是您要使用它的地方,那么您应该使用: secondDoc.importNode(firstDocsNode, true) 尽管单词 'import ' 意味着。
        • 知道布尔值(在本例中为true)代表什么吗?
        • true 用于深层复制 - @see Document.importNode(...)
        • 哇,伙计。这个答案就像长生不老药。尽管如此,还是会要求@Sudheer Palyam 让它更容易理解。对于许多 XML DOM 新手来说,这有点令人困惑。
        【解决方案4】:

        您不能从一个文档中复制一个节点并将其粘贴到另一个文档中。尝试这样做会导致此类错误。

        节点必须正确导入。如果我没记错的话,Document 类为这个常见任务提供了正确的方法。

        编辑

        问题可能出在 setHold 方法背后的代码中。该元素必须被导入。如果这都是自动生成的代码,那么寻找更新版本的轴可以解决问题。请参阅我的评论,其中我提到了轴 1.3/1.4 问题。

        【讨论】:

        • 抱歉,我不确定您的意思,我看不到我将节点从一个文档复制并粘贴到另一个文档的位置。我正在使用从 Axis2 wsdl2java 生成的客户端代码。它生成了一个添加元素的方法,但是当我添加它时会导致错误?
        • 你的轴版本是什么?这里至少有一个报告的问题:issues.apache.org/jira/browse/AXIS-2705
        • 我使用的是 1.4。我会看看使用 1.5 是否可以解决它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多