如何使用多个XSD文件验证XML?

7
我需要对多个XML文件进行验证,以满足给定的XSD文件。问题在于XSD由两个文件组成,它们被嵌套在一起,尽管我知道哪一个是第一个("父级")。在XML文件中,我使用命名空间来定义子节点在哪个XSD中定义((<CBIBdySDDReq xmlns="urn:CBI:xsd:CBIBdySDDReq.00.00.06" xmlns:msg="urn:CBI:xsd:CBISDDReqLogMsg.00.00.06">)。我正在使用Notepad++的XMLTools插件进行其他测试,但它无法找到并验证这些XSD文件,因为我只能提供一个要验证的XSD作为参数。
有没有工具能够测试我的生成的XML文件,以满足超过一个XSD文件?
2个回答

9
你很幸运没有被严重地踩,因为这里的工具(建议)超出了此处的范围。
然而,如果这是关于如何使用你已经在使用的工具实现你需要的目标……而我在SO上看到了很多问题报告……那么一种方法是创建一个XSD文件,在其下引用所有你需要引用的其他XSD文件。
以下是一个适用于你情况的存根XSD的示例:
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import namespace="(a)" schemaLocation="(b)"/>
</xsd:schema>

where:

(a) 是您希望引用的 xsd:schema 的 targetNamespace 属性中的值;如果没有 targetNamespace,则删除命名空间属性(并在存根 XSD 中添加包含一些虚拟值的 targetNamespace)。

(b) 是包含您要引用的 XSD 文件的位置。首先使用完整路径;随着您对 XSD 或工具的了解越来越多,您可能会得出结论:如果您的工具支持,提供相对 URI 更为优秀,即位于您的“存根”XSD(实际上是一个“聚合器”)和其他被引用的 XSD 之间的位置。相对 URI 在移动您的文件时更加友好。例如,如果文件在同一个文件夹中,则只需在此处放置文件名。

对于每个无法通过所有其他 XSD 访问或似乎被您的工具视为不可访问的 XSD,请添加一个 xsd:import 行。


谢谢回答。我是 SO 的新手,所以不知道这里不适合发这个问题。我认为如果这个工具能帮助我开发 XML 文件的导出代码,就可以在这里发布。到目前为止,我在 SO 上看到的其他与 XML-XSD 相关的问题都与实现自己的验证系统有关。感谢快速明确的答复(: - Robert P
1
@Springrbua,别担心;推荐工具往往会引起争议,至少在大多数情况下是这样的... 最好的工具是那个人熟悉并且能够满足自己需求的工具... 考虑到 SO 的格式和重点... - Petru Gardea
我看到 SO 上的问题不应该基于个人观点,下次我会注意。谢谢。 - Robert P

2

我想指出还有另一种方法可以实现这个目标。但是,我应该首先声明,我认为Notepad++的模式验证工具存在缺陷,因此我提供的这种方法无法与Notepad++的XMLTools插件配合使用。通常情况下,您应该能够在XML文件的根元素中声明多个命名空间及其对应的模式文件,如下所示:

然而,最初的回答并没有考虑到Notepad++的缺陷,因此可能会导致问题。如果您遇到了问题,请尝试使用其他XML编辑器或禁用XMLTools插件。

<?xml version="1.0" encoding="utf-8"?>
<ROOT xmlns="https://www.A.org"
xmlns:r="https://www.B.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.A.org A.xsd https://www.B.org B.xsd" >

上述例子类似于O'Reilly的XML In a Nutshell第454页提供的例子。
在这种情况下,当您在Notepad ++中运行验证时,您不必选择目标XSD文件进行验证,因为Notepad ++会检测您的schemaLocation声明并使用它来运行验证。但是,似乎Notepad ++仅会检查schemaLocation属性中最后声明的模式文件。因此,在我的示例中,Notepad ++仅会针对B.xsd验证您的XML文件,并不可避免地引发错误。解决方案是Petru提到的方法:通过“import”声明将A.xsd导入B.xsd。
如果您使用更强大的XML工具,则可能不会遇到此问题。例如,只要让OxygenXML自己检测XSD文件而不强制其针对特定XSD进行验证,它就可以很好地处理此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接