我使用速度模板来创建soap请求。 我使用jax-ws框架来实现Web服务客户端。 我已经连接了一个SOAP Handler来拦截出站消息。
我正在尝试用计算出的新体替换身体内容。
我在处理程序中使用以下代码:
public boolean handleMessage(SOAPMessageContext context) {
boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
if (outbound) {
SOAPMessage msg = context.getMessage();
SOAPPart sp = msg.getSOAPPart();
SOAPEnvelope env = sp.getEnvelope();
SOAPBody body = env.getBody();
body.normalize();
System.out.println(body.getValue());
NodeList list = body.getElementsByTagName("template");
if(list.getLength() > 0) {
Element template = (Element) list.item(0);
if (template != null) {
String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent());
Document bodyElement = XmlUtils.getDocumentFromText(newBody);
body.removeContents();
body.addDocument(bodyElement);
当我执行它时,我收到以下错误:
org.w3c.dom.DOMException:NAMESPACE_ERR:尝试以对名称空间不正确的方式创建或更改对象。
如何在没有太多麻烦的情况下更改xml文本中的正文内容?
答案 0 :(得分:0)
好的,我更多地挖掘,结果发现我找到了解决方案。这是代码:
SOAPMessage msg = context.getMessage();
SOAPPart sp = msg.getSOAPPart();
SOAPEnvelope env = sp.getEnvelope();
SOAPBody body = env.getBody();
body.normalize();
System.out.println(body.getValue());
NodeList list = body.getElementsByTagName("template");
if(list.getLength() > 0) {
Element template = (Element) list.item(0);
if (template != null) {
String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent());
Document bodyElement = XmlUtils.getBody(newBody);
body.removeContents();
body.addDocument(bodyElement);
更重要的是,方法XmlUtils.getBody:
public static Document getBody(String fromText) {
Document result = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
result = builder.parse(new ByteArrayInputStream(fromText.getBytes()));
NodeList list = result.getElementsByTagNameNS("soapenv", "Body");
if(list.getLength() > 0) {
Node body = list.item(0);
result = builder.newDocument();
result.adoptNode(body);
}
} catch(Exception e) {
e.printStackTrace();
}
return result;
}
我实际上是我之前代码中的factory.setNamespaceAware(true)
部分,解释了当时提出的异常。
问题解决了!