0

我使用速度模板来创建一个肥皂请求。我使用 jax-ws 框架来实现一个 Web 服务客户端。我已经连接了一个 SOAP 处理程序来拦截出站消息。

我正在尝试用计算的新正文替换正文内容。

我在处理程序中使用以下代码:

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 文本中更改正文内容?

4

1 回答 1

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)我之前代码中的一部分,解释了当时引发的异常。

问题解决了!

于 2017-09-20T11:38:22.967 回答