Неформатированный вывод при печати сообщения SOAP с StreamResult или после изменения его структуры DOM

1

Я хотел бы выводить содержимое некоторого SOAPMessage (запрос и ответ в этом случае), скажем, на стандартный вывод, и у меня возникают проблемы, чтобы увидеть содержимое в хорошо отформатированном виде:

// Create the Message
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();

// In my case I get the content from a known well XML file (which is well formatted, BTW)
SOAPPart sp = msg.getSOAPPart();
StreamSource prepMsg = new StreamSource(new FileInputStream(targetFile));
sp.setContent(prepMsg);

// Add some info, save changes and send to output
SOAPElement soapHeaderElem = msg.getSOAPHeader().addChildElement("header", "","xmlapi_1.0");
SOAPElement securityHeaderElem = soapHeaderElem.addChildElement("security");
SOAPElement userHeaderElem = securityHeaderElem.addChildElement("user");
userHeaderElem.setValue(user);
SOAPElement passHeaderElem = securityHeaderElem.addChildElement("password");
passHeaderElem.addAttribute(new QName("hashed"), String.valueOf(hashedPassword));
passHeaderElem.setValue(password);

msg.saveChanges();
msg.writeTo(System.out);

Здесь единственная часть, которая хорошо отформатирована, - это часть, загруженная из XML, остальная часть отображается в одной строке!

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP:Header>
    <header xmlns="xmlapi_1.0"><security><user>****</user><password hashed="false">****</password></security></header></SOAP:Header>        
    <SOAP:Body>
     </SOAP:Body>
</SOAP:Envelope>

С другой стороны, когда я проверяю тело ответа с использованием DomSource и StreamResult содержимое сообщения отображается в одной строке (все):

SOAPMessage rp = soapConnection.call(msg, remoteURL);
// Iterate
Source sc = new DOMSource(rp.getSOAPPart().getEnvelope().getBody().getChildNodes().item(i));

// And for each...
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
StreamResult result = new StreamResult(System.out);

Мои вопросы:

  • Есть ли какое-либо свойство, которое я установил для этих объектов, чтобы иметь хорошо отформатированный вывод в любом из случаев? (Что-то похожее на свойство JAXB Marshaller.JAXB_FORMATTED_OUTPUT)?
  • Есть ли способ заставить переформатировать отправленное сообщение?
  • У вас есть лучший способ сделать это?
Теги:
soap
jaxb
formatting

1 ответ

0
Лучший ответ

Наконец, я узнал, что, используя эти свойства в объекте Transformer, вы можете получить хорошо отступы:

TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
// Set formatting
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source sc = soapMessage.getSOAPPart().getContent();

OutputStream streamOut = new FileOutputStream(new File(changeFileFolder, "soapRequest.xml"));
StreamResult result = new StreamResult(streamOut);
tf.transform(sc, result);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню