2015-04-29 23 views
5

Mam tekst XML wygenerowany przez aplikację i muszę owinąć wokół niego kopertę SOAP, a następnie wywołać usługę sieciową.Jak dodać nieprzetworzony tekst XML do elementu SOAPBody

Poniższy kod tworzy kopertę, ale nie wiem, jak dodać istniejące dane XML do elementu 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(); 

Próbowałem body.addTextNode() ale dodaje zawartość tak < a inni uciekli.

+1

co z 'body.appendChild (document.createTextNode (rawXml));'? Nie próbowałem tego, ale w dokumentacji zobaczyłem, że 'SOAPBody' dziedziczy z DOM Element, więc można pracować;) ' document' jest obiektem DOM Document. – rzysia

+0

@rzysia To było blisko. Otrzymałem wyjątek WRONG_DOCUMENT_ERR podczas wykonywania, ale następnie 'body.addDocument (document);' did the trick =). Opublikuję pełny kod. – BonanzaOne

Odpowiedz

6

Poniżej dodaje XML jako dokument:

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

dokumentu:

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; 
} 

Wziąłem od logiki convertStringToDocument()this post.

+1

Jeśli masz wyjątek - "Wyjątek w wątku" główny "org.w3c.dom.DOMException: NAMESPACE_ERR" możesz rozwiązać go za pomocą zestawu 'factory.setNamespaceAware (true);' – limitium

+0

Te spacje nazw powinny zostać dodane: 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

Musisz poinformować moduł XML Serializer, aby nie analizował i nie uciekał do zawartości SOAPBody jako XML. Można to zrobić poprzez zamknięcie XML wewnątrz <![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> 

To wyjście

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

Rozwiązało to znak ucieczki, ale "serializer" dodaje także "". Nie jestem pewien, czy zostanie to bezpiecznie zinterpretowane przez nasz serwer klienta. – BonanzaOne

+0

Zostanie zignorowany, gdy dane zostaną pobrane jako Treść. Następnie serwer klienta musi przeanalizować go, aby odczytać go jako XML. – shazin

Powiązane problemy