【发布时间】:2021-01-14 19:26:47
【问题描述】:
我有带有 SOAP 信封的 XML 数据,但我的 XSD 架构只能验证信封内的 XML 数据。我期待着我可以编辑 XSD 并遍历并且只验证信封内的 xml 的机制。
例如,在 XSLT 中,我们可以选择设置根参数 <xsl:template match="*:MsgHeader"> 而不是 <xsl:template match="*:Envelope">
【问题讨论】:
我有带有 SOAP 信封的 XML 数据,但我的 XSD 架构只能验证信封内的 XML 数据。我期待着我可以编辑 XSD 并遍历并且只验证信封内的 xml 的机制。
例如,在 XSLT 中,我们可以选择设置根参数 <xsl:template match="*:MsgHeader"> 而不是 <xsl:template match="*:Envelope">
【问题讨论】:
正如您所建议的,在 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());
【讨论】: