2015-04-29 23 views
5

Ho un testo XML generato dall'applicazione e ho bisogno di racchiudere una busta SOAP attorno ad esso e successivamente effettuare la chiamata al servizio web.Come aggiungere testo XML non elaborato all'elemento SOAPBody

Il seguente codice crea la busta, ma non so come aggiungere i dati XML esistenti nell'elemento SOAPBody.

String rawXml = "<some-data><some-data-item>1</some-data-item></some-data>"; 

    // Start the API 
    MessageFactory mf = MessageFactory.newInstance(); 
    SOAPMessage request = mf.createMessage(); 
    SOAPPart part = request.getSOAPPart(); 
    SOAPEnvelope env = part.getEnvelope(); 

    // Get the body. How do I add the raw xml directly into the body? 
    SOAPBody body = env.getBody(); 

ho provato body.addTextNode() ma aggiunge contenuti così < e altri per sfuggito.

+1

cosa dire 'body.appendChild (document.createTextNode (rawXml));'? Non ho provato questo, ma nella documentazione ho visto che 'SOAPBody' eredita da DOM Element, quindi è possibile lavorare;) ' document' è un oggetto Document DOM. – rzysia

+0

@rzysia Era vicino. Ho ottenuto un'eccezione WRONG_DOCUMENT_ERR quando lo faccio, ma poi 'body.addDocument (document);' ha fatto il trucco =). Pubblicherò il codice completo. – BonanzaOne

risposta

6

Il seguente aggiunge l'XML come un documento:

Document document = convertStringToDocument(rawXml); 
body.addDocument(document); 
creazione

documento:

private static Document convertStringToDocument(String xmlStr) { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    try { 
     builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new InputSource(new StringReader(xmlStr))); 
     return doc; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

ho preso la logica convertStringToDocument() da this post.

+1

Se si dispone dell'eccezione - 'Exception in thread" main "org.w.c.dom.DOMException: NAMESPACE_ERR' è possibile risolverlo impostando' factory.setNamespaceAware (true); ' – limitium

+0

Questi spazi dei nomi devono essere aggiunti: import org.w3c .dom.Document; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; – Razavi

-1

È necessario comunicare al serializzatore XML di non analizzare e scappare dal contenuto di SOAPBody come XML. È possibile farlo racchiudendo l'XML all'interno <![CDATA[]]>

String rawXml = "<![CDATA[<some-data><some-data-item>1</some-data-item></some-data>]]>"; 

    // Start the API 
    MessageFactory mf = MessageFactory.newInstance(); 
    SOAPMessage request = mf.createMessage(); 
    SOAPPart part = request.getSOAPPart(); 
    SOAPEnvelope env = part.getEnvelope(); 

    // Get the body. How do I add the raw xml directly into the body? 
    SOAPBody body = env.getBody(); 

    SOAPElement se = body.addTextNode(rawXml); 

    System.out.println(body.getTextContent()); 

EDIT

<some-data><some-data-item>1</some-data-item></some-data> 

Questa è l'uscita di

System.out.println(body.getTextContent()); 
+0

Risolve l'escape dei caratteri, ma il serializzatore "" viene anche aggiunto. Non sono sicuro che verrà interpretato in modo sicuro dal nostro server clienti. – BonanzaOne

+0

Sarà ignorato quando i dati vengono recuperati come contenuto di testo. Dopo che il server del cliente deve analizzarlo per leggerlo come XML. – shazin

Problemi correlati