Pregunta sobre spring, java, dom, xml, jaxb – ¿Cómo agrego un prefijo de espacio de nombres a un objeto DOM de XML?

10

Estoy tratando de construir un documento XML utilizando un espacio de nombres específico. El documento final que estoy tratando de generar se verá así:

<m:documentObject xmlns:m="http://www.myschema.com">
    <sender>token</sender>
    <receiver>token</receiver>
    <payload>token</payload>
</m:documentObject>

Esto es lo que tengo hasta ahora.

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element requestElement = document.createElementNS("http://www.myschema.com", "documentObject");

document.appendChild(requestElement);

Element sender = document.createElement("sender");
requestElement.appendChild(sender);     
Text senderText = document.createTextNode("Xmlsender");
sender.appendChild(senderText); 

Element receiver = document.createElement("receiver");
requestElement.appendChild(receiver);       
Text receiverText = document.createTextNode("Xmlreceiver");
receiver.appendChild(receiverText); 

Element payload = document.createElement("payload");
requestElement.appendChild(payload);        
Text payloadText = document.createTextNode("Xmlpayload");
payload.appendChild(payloadText);   

StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);

DOMSource source = new DOMSource(requestElement);

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 
transformer.transform(source, result);

String xmlString = sw.toString();
System.out.println(xmlString)

Por alguna razón, cuando ejecuto lo anterior, el esquema sale sin el prefijo. Como se muestra abajo:

<?xml version="1.0" encoding="utf-8"?>
<documentObject xmlns="http://www.myschema.com">
    <sender>Xmlsender</sender>
    <receiver>Xmlreceiver</receiver>
    <payload>Xmlpayload</payload>
</documentObject>

¿Qué debo hacer para que XML sea exactamente como se muestra en el primer ejemplo de XML con el prefijo de espacio de nombres y las etiquetas para tener el prefijo de espacio de nombres?

Estoy intentando crear una cadena XML que se usará para un servicio web Spring-WS que espera un objeto JAXB que está en el formato que se muestra en el primer ejemplo.

Tenga en cuenta que hay muchas implementaciones diferentes dejavax.xml.transform.Transformer Interfaz que funciona diferente a este respecto. De mi propia experiencia reciente resultó que org.apache.xalan.transformer.TransformerImpl produciría un resultado similar al que usted tiene. Si utiliza com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl producirá el resultado exactamente como espera (pero no utilizará prefijos). Andrew Haritonkin

Tu respuesta

1   la respuesta
13

Puedes usarsetPrefix.

Pero es mejor crear el elemento raíz así:

document.createElementNS("http://www.myschema.com", "m:documentObject");

Tenga en cuenta también que pasarnull acreateElement Es una forma compatible de forzar un espacio de nombres nulo. Sin embargo, en su ejemplo original, esto no funcionaría porque su elemento de documento fuerza efectivamente un espacio de nombres predeterminado al combinar un URI de espacio de nombres sin prefijo.

Otro ejemplo:stackoverflow.com/questions/11133754/… rogerdpack
Fantástica respuesta; Lo mismo se aplica al uso de SuiteScript en NetSuite de Oracle: los módulos parecen exponer los mismos elementos de creación (...) que funcionan más o menos de la misma manera con respecto al prefijo de espacios de nombres. El atributo "prefijo" está documentado como de solo lectura y no hay un setPrefix correspondiente, por lo que fue una verdadera ayuda. Darren Ringer

Preguntas relacionadas