Pytanie w sprawie dom, spring, jaxb, xml, java – Jak dodać prefiks przestrzeni nazw do obiektu DOM XML?

10

Próbuję zbudować dokument XML przy użyciu określonej przestrzeni nazw. Ostateczny dokument, który próbuję wygenerować, powinien wyglądać tak:

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

Oto, co mam do tej pory.

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)

Z jakiegoś powodu, gdy uruchamiam powyższe, schemat wychodzi bez prefiksu. Jak pokazano niżej:

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

Co muszę zrobić, aby XML był dokładnie taki, jak pokazano w pierwszym przykładzie XML z prefiksem przestrzeni nazw i tagami, aby mieć prefiks przestrzeni nazw?

Próbuję utworzyć ciąg XML, który zostanie użyty w usłudze internetowej Spring-WS, która oczekuje obiektu JAXB w formacie pokazanym w pierwszym przykładzie.

Należy pamiętać, że istnieje wiele różnych implementacjijavax.xml.transform.Transformer interfejs, który działa pod tym względem inaczej. Z moich ostatnich doświadczeń wynika, że ​​org.apache.xalan.transformer.TransformerImpl dałoby wynik podobny do tego, jaki masz. Podczas korzystania z com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl wytworzy wynik dokładnie taki, jakiego oczekujesz (ale nie użyje przedrostków). Andrew Haritonkin

Twoja odpowiedź

1   odpowiedź
13

Możesz użyćsetPrefix.

Ale lepiej jest stworzyć taki element główny:

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

Zauważ także to przejścienull docreateElement to obsługiwany sposób wymuszania pustej przestrzeni nazw. W oryginalnym przykładzie nie zadziałałoby to jednak, ponieważ element dokumentu skutecznie wymusza domyślną przestrzeń nazw, łącząc URI przestrzeni nazw bez prefiksu.

Fantastyczna odpowiedź; to samo dotyczy używania SuiteScript w Oracle NetSuite - moduły zdają się ujawniać ten sam createElementNS (...), który działa mniej więcej w ten sam sposób w odniesieniu do prefiksowania przestrzeni nazw. Atrybut „prefiks” jest udokumentowany jako tylko do odczytu i nie ma odpowiadającego mu setPrefix, więc była to prawdziwa pomoc. Darren Ringer
Inny przykład:stackoverflow.com/questions/11133754/… rogerdpack

Powiązane pytania