我有一个 Web 服务和客户端,它们正在传递包含字符引用的字符串,例如 (0x1A)。这些在 XML 1.0 中无效,但在 XML 1.1 中有效。由于这些字符引用,Axis 的 XML 解析器会抛出异常。有没有办法强制它将响应解析为 XML 1.1,或者插入 XML 声明?(目前没有。)我研究过使用处理程序,但我的理解是它们在 XML 已经被解析之后被调用。
3 回答
我想你会在这方面度过一段艰难的时光。我的理解是 WSDL 2.0 标准是建立在 XML 1.0 之上的。那么,您调用的是哪种服务,它使用 WSDL(假设 XML 1.0)来描述自己,然后开始向您发送包含 XML 1.1 字符的消息?
定义 Axis2 服务时,可以在 services.xml 文件中定义它具有的处理程序。例如,在这个页面上,他们有一个使用 org.apache.axis2.receivers.RawXMLINOutMessageReceiver 的服务......我知道这不是你想要做的,但也许这是一个开始寻找或思考的地方。
你是在传递一个InputStream
orReader
吗?如果是这样,您可以将源代码包装在另一个类中(如BufferedReader
作品),但使用它来删除不必要的字符。
还有另一种选择 - 让解析器将输入视为 XML 1.1。由于 Axis2 使用 Woodstox 解析器,您可以扩展WstxInputFactory
and override 方法createPrivateConfig()
:
@Override
public ReaderConfig createPrivateConfig() {
ReaderConfig config = super.createPrivateConfig();
config.enableXml11(true);
return config;
}
然后通过系统属性使用该自定义工厂:-Djavax.xml.stream.XMLInputFactory=mypackage.MyWstxInputFactory
请注意,这种解决方法仅适用于您绝对无法更改产生无效 XML 的有问题的 Web 服务的情况。可能会遇到副作用。