2015-11-25 88 views
3

Collogues,我有周期,这与创建结构所必要的SOAP XML(不要问关于结构)如何删除SOAPElement中的前缀和名称空间?

log.info("Body elements: "); 
NodeList nodeList = body.getElementsByTagName("*") ; 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Node node = nodeList.item(i); 
    if (node.getNodeType() == Node.ELEMENT_NODE) { 
     log.info(node.getNodeName()); 

     if (node.getNodeName().equals("ns2:request")) { 
      log.info("Set namespace and prefix for " + node.getNodeName()); 
      SOAPElement childX = (SOAPElement) node; 
      childX.removeNamespaceDeclaration(childX.getPrefix()) ; 
      childX.addNamespaceDeclaration("ns3", "http://mayacomp/Generic/Ws"); 
      childX.setPrefix("ns3"); 
     } 

     else {       
      if (node.getNodeName().equals("ns2:in")) { 
       log.info("Remove namespace for " + node.getNodeName()); 
       SOAPElement childX = (SOAPElement) node; 
       childX.removeNamespaceDeclaration(childX.getPrefix()) ; 
       childX.addNamespaceDeclaration("", ""); 
       childX.setPrefix(""); 
      } 

      SOAPElement childX = (SOAPElement) node; 
      childX.removeNamespaceDeclaration(childX.getPrefix()) ; 
      childX.setPrefix(""); 
     } 
    } 
} 

结果我收到的XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns3:request xmlns:ns3="http://mayacomp/Generic/Ws"> 
     <in xmlns="http://mayacomp/Generic/Ws"> 
      <requestHeader> 

我的问题是如何去除仅xmlns="http://mayacomp/Generic/Ws"<in>元件和接收:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soapenv:Body> 
      <ns3:request xmlns:ns3="http://mayacomp/Generic/Ws"> 
      <in> 
       <requestHeader> 

UPDATE

我试图XML配置元素:

/*Config body elements*/ 
       while (itBodyElements.hasNext()) 
       { 
        Object o = itBodyElements.next(); 
        SOAPBodyElement bodyElement = (SOAPBodyElement) o; 
        log.info("Elements from 'Body' element = " + bodyElement.getLocalName()); 

        Iterator it2 = bodyElement.getChildElements(); 
         while (it2.hasNext()) 
         { 
           Object requestElement = it2.next(); 
           SOAPBodyElement bodyRequest = (SOAPBodyElement) requestElement; 
           log.info(" Elements from '"+ bodyElement.getLocalName() + "' element = " + bodyRequest.getLocalName()); 
           log.info(" Delete namespace from IN element " + bodyRequest.getLocalName()); 
           bodyRequest.removeNamespaceDeclaration(bodyRequest.getPrefix()); 
           bodyRequest.setPrefix(""); 

           Iterator it3 = bodyRequest.getChildElements(); 
            while (it3.hasNext()) 
            { //work with other elements 

但它不是 '在' 元素效果来。运行之后,我仍然有: <in xmlns="http://mayacomp/Generic/Ws">

UPDATE

我通过调用WS作为未来解决了这个问题:使用的javax.xml.soap库

getWebServiceTemplate().marshalSendAndReceive(
       "URL", 
       request, 
       new WebServiceMessageCallback() 
       { public void doWithMessage(WebServiceMessage message) { 

         SaajSoapMessage saajSoapMessage = (SaajSoapMessage)message; 

         SOAPMessage soapMessage = UtilsClass.createSOAPMessage(in); 

         saajSoapMessage.setSaajMessage(soapMessage); 

       } 

       } 
       ); 

方法createSOAPMessage配置SOAP消息。

+0

你知道XML的2个片段确实意味着不同的东西吗?在第一个''中将在命名空间'http:// mayacomp/Generic/Ws'中。在第二种情况下,它将位于默认名称空间中(不管默认名称空间是什么) – ParkerHalo

回答

-1

你可以只取出使用的东西的属性类似

​​

下面的测试表明,它的工作。

@Test 
public void removeXmlns() throws Exception { 
    String xml = "" + 
      "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + 
      " <soapenv:Body>\n" + 
      "  <ns3:request xmlns:ns3=\"http://mayacomp/Generic/Ws\">\n" + 
      "   <in xmlns=\"http://mayacomp/Generic/Ws\">\n" + 
      "   <requestHeader>\n" + 
      "   </requestHeader>\n" + 
      "   </in>\n" + 
      "  </ns3:request>\n" + 
      " </soapenv:Body>\n" + 
      "</soapenv:Envelope>"; 


    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 

    Document document = builder.parse(ResourceUtils.getFile("/soaptest.xml").getAbsolutePath()); 
    Element body = document.getDocumentElement(); 

    XPath xPath = XPathFactory.newInstance().newXPath(); 
    NodeList nList = (NodeList)xPath.evaluate("/Envelope/Body/request/in", body, XPathConstants.NODESET); 
    for (int i = 0; i < nList.getLength(); ++i) { 
     Element e = (Element) nList.item(i); 
     e.removeAttribute("xmlns"); 
    } 
    DOMSource domSource = new DOMSource(document); 
    StringWriter writer = new StringWriter(); 
    StreamResult result = new StreamResult(writer); 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer = tf.newTransformer(); 
    transformer.transform(domSource, result); 
    logger.info("XML IN String format is: \n" + writer.toString());  
} 

输出是

2015-11-26-11-46-24[]::[main]:(demo.TestCode.removeXmlns(TestCode.java:174):174):INFO :TestCode:XML IN String format is: 
<?xml version="1.0" encoding="UTF-8" standalone="no"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns3:request xmlns:ns3="http://dfg/Ws"> 
     <in> 
      <requestHeader> 
      </requestHeader> 
     </in> 
     </ns3:request> 
    </soapenv:Body> 
</soapenv:Envelope> 
+1

这不起作用,因为在DOM中,元素仍然位于'http:// mayacomp/Generic/Ws'命名空间中。 –

+0

示例传入xml具有和<在xmlns =“http:// mayacomp/Generic/Ws”>中。问题是如何删除第二个命名空间xmlns,这是我的代码示例。 –

+0

您正在使用名称空间不知情分析,但OP使用SAAJ,它始终使用名称空间解析器处理消息。 –

1

如果我理解正确的问题,你的代码得到下面的XML作为输入:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns2:request xmlns:ns3="http://mayacomp/Generic/Ws"> 
     <ns2:in> 
      <ns2:requestHeader> 

而且要将其改造成以下XML :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns3:request xmlns:ns3="http://mayacomp/Generic/Ws"> 
     <in> 
      <requestHeader> 

在这种情况下,调整名称空间声明和名称空间前缀是不够的,因为在DOM中,inrequestHeader元素仍将位于http://mayacomp/Generic/Ws命名空间中。这是因为DOM元素的名称空间URI在创建/分析时确定,并且在稍后添加或删除名称空间声明时不会更改。当序列化DOM时,序列化程序将自动生成必要的名称空间声明,以确保输出中的元素有效地具有DOM中的名称空间。这就是为什么你会在输出中获得xmlns="http://mayacomp/Generic/Ws",尽管该名称空间声明不在DOM中。

您真正需要做的是更改这些元素的名称空间URI。不幸的是,DOM节点没有setNamespaceURI方法,您需要使用Document.renameNode

+0

Andreas Veithen,我补充说明。你可以看一下吗? – May12

+0

您的更新没有考虑我在答案中解释的内容。因此,它仍然不起作用也就不足为奇了。 –

+0

Andreas Veithen,谢谢你的建议。 – May12

相关问题