多个 XSD 实施相同的 targetNamespace - 这是否正确?
Multiple XSD implementing the same targetNamespace - is this correct?
我实现了一个 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.[=18 解析正确的 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 结构的相同命名空间是否正确?
编辑:
似乎还不够清楚。添加了两个示例
My question is, is it correct to specifiy multiple XSD file implementing the same namespace with different xsd structures ?
是的,这是对 XML 架构的有效使用。模式不必由单个 XSD 文件表示。请参阅 https://www.w3.org/TR/xmlschema-0/#SchemaInMultDocs and https://www.w3.org/TR/xmlschema-0/#import
您可能还会发现此线程有帮助:What's the difference between xsd:include and xsd:import?
好的,在询问 w3c 之后,规范中没有任何内容可以排除这一点。
允许重复使用具有不同内容的目标命名空间。
但是,如果您必须验证 XML,如何处理这个问题取决于您自己并视情况而定。
可能的解决方案是将版本标记添加到 xml header 或尽可能合并模式。
在我的上下文中,以上都没有帮助,解析器接口不允许附加信息,并且 xsds 不能通过选择组合。
解决该问题的唯一方法是创建不同的索引、解析器组合。创建验证器时,我必须根据 xml 来自的来源使用正确的解析器。
我实现了一个 xsd 扫描器,它创建了一个 targetNamespace=
地图
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.[=18 解析正确的 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 结构的相同命名空间是否正确?
编辑: 似乎还不够清楚。添加了两个示例
My question is, is it correct to specifiy multiple XSD file implementing the same namespace with different xsd structures ?
是的,这是对 XML 架构的有效使用。模式不必由单个 XSD 文件表示。请参阅 https://www.w3.org/TR/xmlschema-0/#SchemaInMultDocs and https://www.w3.org/TR/xmlschema-0/#import
您可能还会发现此线程有帮助:What's the difference between xsd:include and xsd:import?
好的,在询问 w3c 之后,规范中没有任何内容可以排除这一点。
允许重复使用具有不同内容的目标命名空间。 但是,如果您必须验证 XML,如何处理这个问题取决于您自己并视情况而定。
可能的解决方案是将版本标记添加到 xml header 或尽可能合并模式。
在我的上下文中,以上都没有帮助,解析器接口不允许附加信息,并且 xsds 不能通过选择组合。
解决该问题的唯一方法是创建不同的索引、解析器组合。创建验证器时,我必须根据 xml 来自的来源使用正确的解析器。