2017-01-02 12 views
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Request xmlns="http://www.dccinterface.co.uk/ServiceUserGateway"> 
    <Header> 
     <RequestID>124</RequestID> 
     <CommandVariant>1</CommandVariant> 
    </Header> 
    <Body> 
     <ReadInventory> 
      <DeviceID>11-22-22-33-55-66-77-88</DeviceID> 
     </ReadInventory> 
    </Body> 
    <ns2:Signature xmlns:ns2="http://www.w3.org/2000/09/xmldsig#"> 
     <ns2:SignedInfo Id="123"/> 
    </ns2:Signature> 
</Request> 

Но вместо выше я получаю:JAXB сортировочных

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Request xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" 
     xmlns="http://www.dccinterface.co.uk/ServiceUserGateway"> 
    <Header> 
     <RequestID>124</RequestID> 
     <CommandVariant>1</CommandVariant> 
    </Header> 
    <Body> 
     <ReadInventory> 
      <DeviceID>11-22-22-33-55-66-77-88</DeviceID> 
     </ReadInventory> 
    </Body> 
    <ns2:Signature> 
     <ns2:SignedInfo Id="123"/> 
    </ns2:Signature> 
</Request> 

ПРИМЕЧАНИЕ: Я достиг этого с помощью Xpath и DOM Processor.

Можете ли вы предложить мне другой способ сделать это другим, чем DOM и XPath?

Ниже был тот же код, что и удаление пространства имен uri от root и вкладки uri to child.

Чтобы добавить пространство имен дочернего элемента:

package com.dcc.serviceUserGateway; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.StringWriter; 
import java.math.BigInteger; 
import java.nio.charset.StandardCharsets; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 
import com.dcc.serviceUserGateway.Request.Body; 
import com.dcc.serviceUserGateway.Request.Header; 

public class SignatureTest { 
    static JAXBContext jaxbContext1 = null; 
    static JAXBContext jaxbContext2 = null; 
    static { 
     try { 
      jaxbContext1 = JAXBContext.newInstance(Request.class); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) throws TransformerException, 
      ParserConfigurationException, SAXException, IOException { 
     Request request = new Request(); 
     Header header = new Header(); 
     header.setRequestID("124"); 
     header.setCommandVariant(BigInteger.valueOf(1l)); 
     Body body = new Body(); 
     ReadInventory inventory = new ReadInventory(); 
     inventory.setDeviceID("11-22-22-33-55-66-77-88"); 
     body.setReadInventory(inventory); 
     SignatureType sig = new SignatureType(); 
     SignedInfoType type = new SignedInfoType(); 
     type.setId("123"); 
     sig.setSignedInfo(type); 

     request.setHeader(header); 
     request.setBody(body); 
     request.setSignature(sig); 

     String inputXML = asXmlString(request); 
     System.out.println(inputXML); 

     String xmlData = XPathUtils.removeNameSpace(inputXML); 
     System.out 
       .println("----------------------------------------------------------------"); 
     System.out.println("xmlData = " + xmlData); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document document = db.parse(new ByteArrayInputStream(xmlData 
       .getBytes(StandardCharsets.UTF_8))); 
     NodeList signatureNodes = document 
       .getElementsByTagName("ns2:Signature"); 

     for (int i = 0; i < signatureNodes.getLength(); i++) { 
      Element item = (Element) signatureNodes.item(i); 
      item.setAttribute("xmlns:ns2", "http://www.w3.org/2000/09/xmldsig#"); 
     } 

     String output = transformDocumentToXmlString(document); 
     System.out.println(output); 
     DocumentBuilderFactory dbf1 = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db1 = dbf1.newDocumentBuilder(); 
     Document document1 = db1.parse(new ByteArrayInputStream(output 
       .getBytes(StandardCharsets.UTF_8))); 
     NodeList signatureNodes1 = document1.getElementsByTagName("Request"); 
     for (int i = 0; i < signatureNodes1.getLength(); i++) { 
      Element item = (Element) signatureNodes1.item(i); 
      item.setAttribute("xmlns", 
        "http://www.dccinterface.co.uk/ServiceUserGateway"); 
     } 

     String requestXML = transformDocumentToXmlString(document1); 
     System.out.println(requestXML); 

    } 

    private static String transformDocumentToXmlString(Document document) 
      throws TransformerException { 
     try { 
      Source source = new DOMSource(document); 
      StringWriter stringWriter = new StringWriter(); 
      Result result = new StreamResult(stringWriter); 
      TransformerFactory factory = TransformerFactory.newInstance(); 
      Transformer transformer = factory.newTransformer(); 
      transformer.transform(source, result); 
      return stringWriter.getBuffer().toString(); 
     } catch (TransformerConfigurationException e) { 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public static String asXmlString(Object bean) throws TransformerException { 
     StringWriter sw = new StringWriter(); 
     try { 
      if (jaxbContext1 != null) { 
       Marshaller m = jaxbContext1.createMarshaller(); 
       m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
       m.marshal(bean, new StreamResult(sw)); 
      } 

     } catch (Exception e) { 
      throw new TransformerException(
        "Couldn't be generated XML string from bean object.", e); 
     } 
     return sw.toString(); 

    } 
} 

Чтобы удалить пространство имен в корневом каталоге:

TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer transformer = tf.newTransformer(); 
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
transformer.setOutputProperty(OutputKeys.INDENT, "false"); 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource inputSource = new InputSource(new StringReader(xml)); 
Document xmlDoc = builder.parse(inputSource); 
Node root = xmlDoc.getDocumentElement(); 
NodeList rootchildren = root.getChildNodes(); 
Element newroot = xmlDoc.createElement(root.getNodeName()); 
for (int i = 0; i < rootchildren.getLength(); i++) { 
    newroot.appendChild(rootchildren.item(i).cloneNode(true)); 
} 
xmlDoc.replaceChild(newroot, root); 
DOMSource requestXMLSource = new DOMSource(xmlDoc.getDocumentElement()); 
StringWriter requestXMLStringWriter = new StringWriter(); 
StreamResult requestXMLStreamResult = new StreamResult(requestXMLStringWriter); 
transformer.transform(requestXMLSource, requestXMLStreamResult); 
String modifiedRequestXML = requestXMLStringWriter.toString(); 
return modifiedRequestXML; 

Просьба предоставить мне лучшее решение других, то это.

+0

к приведенному выше образцу, у меня есть 2 XSD XSD содержит запрос и тело, импортированный XSD содержит подпись – Jhasni

+0

Вместо того, чтобы вставлять код, пожалуйста, опишите проблему, с которой вы сталкиваетесь, и ваш подход к ее решению. Это не означает, что мы исправим ваше сообщество code_, но если вы сами приложите некоторые усилия, то, надеюсь, будут люди, которые с радостью помогут вам. –

ответ

0

определение пространства имен с помощью префикса должно выполняться в корневом элементе. То, что вы хотите, не допускается в XML.

+1

Это утверждение неверно. См. [Пространства имен XML] (https://www.w3.org/TR/xml-names/#scoping-defaulting): «* Область объявления пространства имен, объявляющая префикс, продолжается от начала стартового тега в который, кажется, до конца соответствующего конечного тега * " – Meyer

+0

@Meyer, но это верно только в том случае, если префикс не используется. –

+2

Нет, это включает в себя префиксные объявления. Это часто встречается в сообщениях [SOAP] (например, http://www.w3.org/TR/soap12-part1/#firstexample). – Meyer