JAX WS SOAP处理程序,用于过滤掉无效的xml字符 - java

我有一个Web服务,在客户端中传递带有一些无效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;
    }

}

java大神给出的解决方案

正如您已经知道的那样,您需要做的是在不解析XML的情况下更改XML。这不一定是一个容易的问题,但至少是更通用的。

首先将您的消息作为裸字符串:

ByteArray OutputStream out = new ByteArrayOutputStream();
soapMsg.writeTo(out);
String messageAsString = new String(out.toByteArray());

然后仅在字符串上使用stripNonValidXMLCharacters,并将结果用作SOAPMessageContext::setMessage的输入,在您的情况下,该输入似乎是context.setMessage(...)

还请查看以下有关调整无效XML的更漂亮方法:removing invalid XML characters from a string in java和Parsing malformed/incomplete/invalid XML files。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java

我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…