【问题标题】:How to validate XML against multiple XSD files?如何针对多个 XSD 文件验证 XML?
【发布时间】:2014-02-05 02:29:53
【问题描述】:

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


    【解决方案1】:

    你应该认为自己很幸运,你没有被严重否决......如果只是因为做事的工具(建议)不在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,则删除命名空间属性(并向存根 XSD 添加一个包含一些虚拟值的 targetNamespace)

    (b) 包含您要引用的 XSD 的文件的位置。从这里使用完整路径开始;随着您对 XSD 或您的工具的了解更多,您可能会得出这样的结论:如果您的工具支持,最好提供相对 URI,即在您的“存根”XSD 的位置之间(它实际上是一个“聚合器”) ") 和其他引用的 XSD。相对 URI 在移动你的东西方面更友好(作为一个整体,如压缩所有文件并发送给其他人)。举个例子...如果文件在同一个文件夹中,您只需在此处输入文件名即可。

    为无法通过所有其他 XSD“访问”的每个 XSD 添加一个 xsd:import 行,或者您的工具似乎抱怨为不可访问。

    【讨论】:

    • 感谢您的回答。我是新来的所以我不知道它不属于这里。我认为如果该工具通过开发 XML 文件的导出代码来帮助我,在这种情况下,可以将其发布在这里。到目前为止,我看到的关于 SO 的其他 XML-XSD 相关问题是关于实现自己的验证系统。感谢您快速明确的回答(:
    • @Springrbua,不用担心;推荐工具必然会引起争论,至少在大多数情况下……最好的工具是一个知道并做自己需要的工具……并且考虑到 SO 的格式和重点……
    • 我已经看到关于 SO 的问题不应该基于意见,下次我会尝试考虑它。谢谢
    【解决方案2】:

    我想指出还有另一种方法可以实现这一点。但是,我首先应该声明,我相信 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 a Nutshell 第 454 页提供的示例。

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2011-02-07
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多