Frage an dom, xml, java, jaxb, spring – Wie füge ich einem XML-DOM-Objekt ein Namespace-Präfix hinzu?

10

Ich versuche, ein XML-Dokument mit einem bestimmten Namespace zu erstellen. Das endgültige Dokument, das ich zu generieren versuche, soll folgendermaßen aussehen:

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

Hier ist, was ich bisher habe.

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)

Aus irgendeinem Grund kommt das Schema ohne das Präfix heraus, wenn ich das oben genannte ausführe. Wie nachfolgend dargestellt:

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

Was muss ich tun, damit XML genau wie im ersten XML-Beispiel mit dem Namespace-Präfix und den Tags mit dem Namespace-Präfix angezeigt wird?

Ich versuche, eine XML-Zeichenfolge zu erstellen, die für einen Spring-WS-Webservice verwendet wird, der ein JAXB-Objekt im im ersten Beispiel gezeigten Format erwartet.

Bitte beachten Sie, dass es viele verschiedene Implementierungen von gibtjavax.xml.transform.Transformer Schnittstelle, die in dieser Hinsicht anders funktionieren. Aus meiner eigenen jüngsten Erfahrung hat sich herausgestellt, dass org.apache.xalan.transformer.TransformerImpl zu ähnlichen Ergebnissen führen würde wie Sie. Bei Verwendung von com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl wird das Ergebnis genau wie erwartet erzeugt (es werden jedoch keine Präfixe verwendet). Andrew Haritonkin

Deine Antwort

1   die antwort
13

setPrefix.

Es ist jedoch besser, das Root-Element wie folgt zu erstellen:

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

Beachten Sie auch das Vorbeigehennull zucreateElement ist eine unterstützte Methode zum Erzwingen eines Null-Namespaces. In Ihrem ursprünglichen Beispiel würde dies jedoch nicht funktionieren, da Ihr Dokumentelement einen Standardnamespace erzwingt, indem ein Namespace-URI ohne Präfix kombiniert wird.

Ein anderes Beispiel:stackoverflow.com/questions/11133754/… rogerdpack
Fantastische Antwort; Gleiches gilt für die Verwendung von SuiteScript in der NetSuite von Oracle. Die Module weisen anscheinend die gleichen createElementNS (...) auf, die in Bezug auf das Namespace-Präfix in etwa gleich funktionieren. Das Attribut "Präfix" ist schreibgeschützt und es gibt kein entsprechendes setPrefix. Dies war also eine echte Hilfe. Darren Ringer

Verwandte Fragen