簡體   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> 

但是我得到的不是上面的:

<?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,並將uri刪除至子選項卡。

要將名稱空間添加到子元素:

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;

除此之外,請為我提供最佳解決方案。

帶有前綴的名稱空間定義必須在根元素中完成。 XML不允許您想要的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM