SOAPUI(5.4.0)XML响应XSD验证失败:xsd:any不被识别求助
我之前在使用SoapUI 5.x版本做Schema合规校验时,也碰到过类似xsd:any不被识别、导致自定义子元素被判定为非法的问题,给你几个实测有效的解决思路:
检查xsd:any的属性配置
默认情况下,xsd:any的processContents属性是strict,这会强制Schema校验器检查所有子元素的合规性,哪怕是xsd:any声明的部分。你可以把这个属性改成lax(仅当能找到对应Schema时才校验)或者skip(完全跳过校验),比如:<xsd:element name="ObjectList"> <xsd:complexType> <xsd:sequence> <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element>另外还要确认
namespace属性是否匹配你的YYY元素的命名空间,如果YYY是无命名空间的,用##local;允许任意命名空间就用##any。调整SoapUI断言的配置选项
在Schema合规断言的编辑窗口里,找找有没有「忽略未知元素」的勾选框(5.4.0版本里这个选项在断言设置的高级部分),勾选后SoapUI会跳过对xsd:any下未定义元素的校验。如果找不到这个选项,可以尝试关闭「Fail on warnings」开关,有些情况下xsd:any相关的问题会被标记为警告而非错误。改用Groovy脚本断言自定义校验逻辑
如果前面的方法都不生效,完全可以用Groovy脚本断言替代默认的Schema合规校验,这样能精准控制哪些元素需要校验、哪些可以跳过。比如下面的示例脚本会跳过ObjectList下的YYY元素,只校验其他必要内容:// 解析响应XML def xmlParser = new XmlSlurper() def responseDoc = xmlParser.parseText(context.response) // 校验必填元素(示例) assert responseDoc.RequiredElement.size() > 0 : "响应中缺少必填元素RequiredElement" // 对于ObjectList下的YYY元素,直接跳过校验,不做断言判断 def yyyElements = responseDoc.ObjectList.YYY log.info("ObjectList下的YYY元素数量:${yyyElements.size()}")升级SoapUI到新版本
SoapUI 5.4.0是2018年发布的老版本,后续的5.6.x版本或者ReadyAPI社区版(SoapUI的开源后续版本)修复了不少Schema校验的Bug,包括xsd:any的识别问题。如果项目允许的话,升级到新版本大概率能直接解决这个问题。
内容的提问来源于stack exchange,提问作者Nata

