<?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;
Просьба предоставить мне лучшее решение других, то это.
к приведенному выше образцу, у меня есть 2 XSD XSD содержит запрос и тело, импортированный XSD содержит подпись – Jhasni
Вместо того, чтобы вставлять код, пожалуйста, опишите проблему, с которой вы сталкиваетесь, и ваш подход к ее решению. Это не означает, что мы исправим ваше сообщество code_, но если вы сами приложите некоторые усилия, то, надеюсь, будут люди, которые с радостью помогут вам. –