我需要根据给定的 XSD 文件验证多个 XML 文件。问题是 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 作为参数进行验证。
是否有工具能够针对多个 XSD 文件测试生成的 XML 文件?
答案 0 :(得分:7)
你应该认为自己很幸运,你没有得到大量的投票......只是因为那些做事情的工具(建议)超出了范围here ......
尽管如此,如果这是关于如何使用您已经使用的工具实现您所需要的......并且我已经看到了很多关于SO的问题...那么一种方法可以随时工作某人有能力提供单个XSD文件的限制...是创建这样一个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>
其中:
(a)是您希望引用的xsd:schema的targetNamespace属性中看到的值;如果没有targetNamespace,则删除namespace属性(并将包含一些虚拟值的targetNamespace添加到stub XSD)
(b)包含您要引用的XSD的文件的位置。首先使用完整路径;当您了解有关XSD或您的工具的更多信息时,您可能会得出结论:如果您的工具支持,则提供相对URI,即“存根”XSD的位置(它实际上是“聚合器”)之间更好“)和另一个引用的XSD。相对URI在移动你的东西方面更友好(作为整个单元,如在压缩所有文件并发送给其他人)。一个例子......如果文件在同一个文件夹中,你只需要在这里放置文件的名称。
为通过所有其他XSD“无法访问”的每个XSD添加一个xsd:import行,或者您的工具似乎抱怨为不可访问。
答案 1 :(得分:0)
我想指出还有另一种方法可以实现这一目标。但是,我首先要指出,我相信Notepad ++的模式验证工具是...越野车,因此我提供的此方法不适用于Notepad ++的XMLTools插件。通常,您应该能够在XML文件的根元素中声明多个名称空间及其对应的架构文件,如下所示:
<?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 Nutshell中的第454页上提供的示例。
在这种情况下,当您在Notepad ++中运行验证时,不必选择目标XSD文件进行验证,因为Notepad ++会检测到您的schemaLocation声明并使用该声明运行验证。但是,似乎Notepad ++只会检查schemaLocation属性中最后声明的架构文件。因此,在我的示例中,Notepad ++将仅针对B.xsd验证XML文件,并不可避免地引发错误。 Petru提到了一种解决方案:通过“ import”声明将A.xsd导入B.xsd。
如果您使用的是更强大的XML工具,则可能不会遇到此问题。例如,只要您让OxygenXML自己检测XSD文件并且不强制其针对特定的XSD进行验证,OxygenXML便可以很好地处理此问题。