简体   繁体   English

JaxB编组

[英]JaxB marshalling

<?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> 

But instead of above I am getting: 但是我得到的不是上面的:

<?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>

NOTE : I have achieved this using Xpath and DOM Processor. 注意:我已经使用Xpath和DOM Processor实现了这一点。

Can you please suggest me is it any other way to do this other then DOM and XPath? 您能否建议我,除了DOM和XPath之外,还有其他方法吗?

Below was the same code to remove the namespace uri from root and the uri to child tab. 下面是相同的代码,用于从根目录删除名称空间uri,并将uri删除至子选项卡。

To add the namespace to child element: 要将名称空间添加到子元素:

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();

    }
}

To remove namespace in root: 要在根目录中删除名称空间:

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;

Kindly provide me the best solution other then this. 除此之外,请为我提供最佳解决方案。

the name space definition with prefix must be done in the root element. 带有前缀的名称空间定义必须在根元素中完成。 What you want is not allowed in XML. XML不允许您想要的东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM