2012-06-12 26 views
9

Próbuję zbudować dokument XML przy użyciu określonego obszaru nazw. Ostateczny dokument, który próbuję wygenerować, powinien wyglądać tak:Jak dodać prefiks przestrzeni nazw do obiektu XML DOM?

<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 po uruchomieniu powyższego schematu pojawia się bez prefiksu. Jak pokazano poniż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ć tak, że XML jest dokładnie tak, jak pokazano w pierwszym przykładzie XML z przedrostka przestrzeni nazw i tagów mieć przedrostek przestrzeni nazw?

Próbuję utworzyć ciąg znaków XML, który będzie używany w usłudze Spring-WS, która oczekuje obiektu JAXB, który ma format pokazany w pierwszym przykładzie.

+0

Należy zauważyć, że istnieje wiele różnych implementacji interfejsu 'javax.xml.transform.Transformer', które działają inaczej pod tym względem. Z moich ostatnich doświadczeń wynika, że ​​org.apache.xalan.transformer.TransformerImpl przyniosłoby wynik podobny do tego, jaki masz. Podczas korzystania z pliku com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl można uzyskać wynik dokładnie taki, jak się spodziewasz (ale nie użyje prefiksów). –

Odpowiedz

12

Można użyć setPrefix.

Ale lepiej jest utworzyć element główny takiego:

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

Należy również zauważyć, że przechodząc null do createElement jest obsługiwana sposób zmuszając null nazw. W oryginalnym przykładzie nie działałoby to jednak, ponieważ element dokumentu skutecznie wymusza domyślny obszar nazw, łącząc identyfikator URI przestrzeni nazw bez prefiksu.

Powiązane problemy