如何针对多个XSD文件验证XML?

问题描述 投票:1回答:2

我需要针对给定的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文件?

xml validation xsd
2个回答
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行,或者您的工具似乎抱怨为不可访问。


0
投票

我想指出还有另一种方法来实现这一目标。但是,我首先应该说我相信Notepad ++的模式验证工具是... buggy,因此我提供的这种方法不适用于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 a Nutshell中的第454页提供的示例。

在这种情况下,当您在Notepad ++中运行验证时,您不必选择目标XSD文件进行验证,因为Notepad ++会检测您的schemaLocation声明并使用它来运行验证。但是,似乎Notepad ++只会检查schemaLocation属性中最后声明的模式文件。因此,在我的示例中,Notepad ++将仅针对B.xsd验证您的XML文件,并且不可避免地会抛出错误。解决方案是Petru提到的解决方案:通过“import”声明将A.xsd导入B.xsd。

如果您使用的是更强大的XML工具,则可能不会遇到此问题。例如,OxygenXML处理这个就好了,只要你让它自己检测XSD文件而不强迫它对特定的XSD进行验证。

© www.soinside.com 2019 - 2024. All rights reserved.