【问题标题】:Multiple XSD implementing the same targetNamespace - is this correct?多个 XSD 实现相同的 targetNamespace - 这是正确的吗?
【发布时间】:2021-06-07 07:45:38
【问题描述】:

我实现了一个 xsd 扫描器,它创建了一个 targetNamespace= 目录。 包含被过滤,因此目录只有 targetNamespace 的根文件。 使用此目录,我正在解析所需的文件(使用 LSResourceResolver)来验证传入的 xml 文件。

地图

namespace1=path/xsdForNameSpace1
namespace2=path/xsdForNameSpace2
:

但现在我得到了多个 XSD,包含不同的内容,但实现了相同的 targetNamespace。 恕我直言,这是不正确的,一个命名空间一个根 xsd - 完成

例子

schema1.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.xxxxxxx.com/texxxxxxx"
        targetNamespace="http://www.xxxxxxx.com/texxxxxxx"
        elementFormDefault="qualified">
<xsd:include schemaLocation="xxxxxx_xxxxxx_xxxxx_xxxxx.xsd"/>
<xsd:element name="ab120">
    <xsd:complexType>
:

schema2.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.xxxxxxx.com/texxxxxxx"
        targetNamespace="http://www.xxxxxxx.com/texxxxxxx"
        elementFormDefault="qualified">
<xsd:include schemaLocation="xxxxxx_xxxxxx_xxxxx_xxxxx.xsd"/>
<xsd:element name="ab122">
    <xsd:complexType>
:

我有两个 xml 文件正在实现相同的命名空间 http://www.xxxxxxx.com/texxxxxxx 一个具有根元素 ab120 另一个具有根元素 ab122 .

在这种情况下,我的地图只包含一个实现的 xsd 文件,我不知道如何为传入的 xml 解析正确的 xsd。

传入的 xml 文件如下所示。

file1.xml:

<ab120 xmlns="http://www.xxxxxxx.com/texxxxxxx" ...>
 : 
</ab120>

file2.xml

<ab122 xmlns="http://www.xxxxxxx.com/texxxxxxx" ...>
 :
</ab122>

LSResourceResolver 接口不允许我访问 xml,所以我无法根据根节点决定我应该使用哪个 xsd。

我的临时解决方案:

我用 (namespace,xsd_file_name) 添加了第二个索引,当 xml 提供实现文件 (systemID) 时会正确解析

targenNamespace="namespace myfile.xsd" 

我的问题是,指定多个 XSD 文件以不同的 xsd 结构实现相同的命名空间是否正确?

编辑: 似乎还不够清楚。添加了两个例子

【问题讨论】:

    标签: java xml xsd xsd-validation


    【解决方案1】:

    我的问题是,指定多个 XSD 文件以不同的 xsd 结构实现相同的命名空间是否正确?

    是的,这是对 XML 模式的有效使用。架构不必由单个 XSD 文件表示。请参阅https://www.w3.org/TR/xmlschema-0/#SchemaInMultDocshttps://www.w3.org/TR/xmlschema-0/#import

    您也可能会发现此主题很有帮助:What's the difference between xsd:include and xsd:import?

    【讨论】:

    • 我的问题似乎不够清楚。导入和包含不是问题。问题是让多个根 xsd 实现相同的命名空间。我在问题中添加了一个示例。
    【解决方案2】:

    好的,在询问 w3c 后,规范中没有任何内容排除这一点。

    允许重用具有不同内容的 targetNamespace。 但是,如果您必须验证 XML,如何处理这个问题取决于您自己的情况。

    可能的解决方案是在 xml 标头中添加版本标记,或者尽可能组合模式。

    在我的上下文中,上述任何方法都无济于事,解析器接口不允许附加信息,并且 xsds 不能通过选择进行组合。

    解决问题的唯一方法是创建不同的索引、解析器组合。创建验证器时,我必须根据 xml 的来源使用正确的解析器。

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2019-09-01
      • 1970-01-01
      • 2015-06-02
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多