使用没有 Soap Envelope 的 XSD 验证 XML 数据

Posted

技术标签:

【中文标题】使用没有 Soap Envelope 的 XSD 验证 XML 数据【英文标题】:Validate XML data with XSD without Soap Envelope 【发布时间】:2021-01-14 19:26:47 【问题描述】:

我有带有 SOAP 信封的 XML 数据,但我的 XSD 架构只能验证信封内的 XML 数据。我期待着我可以编辑 XSD 并遍历并且只验证信封内的 xml 的机制。

例如,在 XSLT 中,我们可以选择设置根参数 <xsl:template match="*:MsgHeader"> 而不是 <xsl:template match="*:Envelope">

【问题讨论】:

【参考方案1】:

正如您所建议的,在 XSLT (2.0+) 中进行验证是一种选择 - 但可能不是一个很好的选择,因为 XSLT 在第一个验证错误后停止。

如果您使用 Saxon 作为验证引擎,那么您可以像这样从 Java 进行所需的验证:

Processor p = new Processor(true);
SchemaManager sm = p.getSchemaManager();
sm.load(new StreamSource(new File('schema.xsd')));
SchemaValidator sv = sm.newSchemaValidator();
DocumentBuilder db = p.newDocumentBuilder();
XdmNode doc = db.build(new StreamSource(new File('source.xml')));
XdmNode target = (XdmNode)doc.select(descendant("payload")).findFirst().get();
sv.validate(target.asSource());

【讨论】:

是的,解决方案听起来不错。但是我希望对代码进行最小/不更改并仅使用 XSD 文件来解决它(因为某些 xml 可能没有该要求)。如果您可以建议任何可用于通过更改 XSD 本身来绕过 SOAP 信封的机制,那就太好了。再次感谢您的快速响应和代码更改。 你不能只为 SOAP 信封命名空间添加一个模式吗? 是的,不完全导入 SOAP 信封,我通过创建另一个定义为 here 的架构的 xsd 解决了这个问题,然后通过替换第 62 行来导入我的主 xsd。谢谢您的帮助跨度>

以上是关于使用没有 Soap Envelope 的 XSD 验证 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章

SoapFault:元素 http://schemas.xmlsoap.org/soap/envelope/:Body 上没有 id 属性(代码 wsse:InvalidSecurity)

PHP SOAP 发送XML

如何使用正则表达式处理来自SOAP XML的数据

如果我使用 wcf,如何将 <s:Envelope 更改为 <SOAP-ENV:Envelope?

Worklight - SOAP 适配器无法解析 <soapenv:Envelope> 请求

WCF - 错误:传出消息的消息版本 (Soap12 (http://www.w3.org/2003/05/soap-envelope)