我有一个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 - javaprivate 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大神给出的解决方案 如果您不喜欢循环,则…