JAXWS SOAPHandler用于过滤无效的XML字符。

3

我有一个webservice,客户端传递了一些带有无效xml字符的字符串。在服务器端解析请求时,JAXWS会因为无法解析这些无效的xml字符而抛出异常。

为了解决这个问题,我尝试创建以下SOAPHandler。在下面的SOAPHandler中,我尝试迭代子元素,这意味着我已经在解析xml并且在处理程序本身中遇到了异常。

如何从消息中删除无效的xml字符?

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

public class InvalidXmlCharacterHandler implements SOAPHandler<SOAPMessageContext>{

     private static final Logger LOGGER = Logger.getLogger(InvalidXmlCharacterHandler.class);


    @Override
    public boolean handleMessage(SOAPMessageContext context) {

        System.out.println("Server : handleMessage()......");

        Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        //for request message only
        if(!isRequest){

            SOAPMessage soapMsg = context.getMessage();

            if (soapMsg != null) {
               try {

                   java.util.Iterator iterator = soapMsg.getSOAPBody().getChildElements();
                   while (iterator.hasNext()) {
                     SOAPBodyElement bodyElement = (SOAPBodyElement) iterator.next();
                     String val = bodyElement.getTextContent();
                     bodyElement.setTextContent(stripNonValidXMLCharacters(val));    
                     System.out.println("The Value is:" + val);
                   }


               } catch (SOAPException ex) {
                  LOGGER.error("Failed to get and set source", ex);
               }

            }

        }

        //continue other handler chain
        return true;
    }




     public static String stripNonValidXMLCharacters(String in) {
          StringBuffer out = new StringBuffer(); // Used to hold the output.
          char current; // Used to reference the current character.

          if (in == null || ("".equals(in))) return ""; // vacancy test.
          for (int i = 0; i < in.length(); i++) {
              current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught here; it should not happen.
              if ((current == 0x9) ||
                  (current == 0xA) ||
                  (current == 0xD) ||
                  ((current >= 0x20) && (current <= 0xD7FF)) ||
                  ((current >= 0xE000) && (current <= 0xFFFD)) ||
                  ((current >= 0x10000) && (current <= 0x10FFFF)))
                  out.append(current);
          }
          return out.toString();
      }   

    @Override
    public boolean handleFault(SOAPMessageContext context) {

        System.out.println("Server : handleFault()......");

        return true;
    }

    @Override
    public void close(MessageContext context) {
        System.out.println("Server : close()......");
    }

    @Override
    public Set<QName> getHeaders() {
        System.out.println("Server : getHeaders()......");
        return null;
    }

}
1个回答

0
你需要做的是在不解析XML的情况下进行更改,正如你已经发现的那样。这并不一定是一个容易的问题,但至少更通用。
首先将你的消息作为裸字符串处理:
ByteArray OutputStream out = new ByteArrayOutputStream();
soapMsg.writeTo(out);
String messageAsString = new String(out.toByteArray());

然后只需在字符串上使用stripNonValidXMLCharacters,并将结果用作SOAPMessageContext :: setMessage的输入,在您的情况下似乎是context.setMessage(...)
此外,请查看以下内容以获得更漂亮的调整无效XML的方法:{{link1:在Java中从字符串中删除无效的XML字符}}和{{link2:解析格式不正确/不完整/无效的XML文件}}。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接