java 多个XSD实现相同的targetNamespace -这是否正确?

d7v8vwbk  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(158)

我实现了一个xsd扫描器,它创建了一个targetNamespace=<file.xsd>catalog。Includes被过滤掉了,所以这个目录只有targetNamespace的根文件。使用这个目录,我正在解析所需的文件(使用LSResourceResolver)来验证传入的xml文件。
Map

namespace1=path/xsdForNameSpace1
namespace2=path/xsdForNameSpace2
:

但是现在我得到了多个XSD,包含不同的内容,但是实现了相同的targetNamespace。恕我直言,这是不正确的,一个命名空间一个根xsd - done
示例
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一个具有根元素ab 120**,另一个具有根元素ab 122
在这种情况下,我的map只包含一个实现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文件是否正确?
编辑:似乎不够清楚。添加了两个示例

iqjalb3h

iqjalb3h1#

我的问题是,用不同的xsd结构指定实现相同名称空间的多个XSD文件是否正确?
是的,这是XML架构的有效用法。架构不必由单个XSD文件表示。请参见www.example.com和www.example.com 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?

ldioqlga

ldioqlga2#

好吧,在问过w3c之后,规范中没有排除这一点。
允许重用具有不同内容的targetNamespace。但是,如果您必须验证XML,则如何处理这一问题取决于您自己的情况。
可能的解决方案是在XML头中添加一个版本标记,或者如果可能的话合并模式。
在我的上下文中,上述任何内容都没有帮助,解析器接口不允许附加信息,并且不能通过选择来组合xsds。
解决这个问题的唯一方法是创建不同的索引,解析器组合。当创建验证器时,我必须根据XML的来源使用正确的解析器。

r1wp621o

r1wp621o3#

将两个现有的XSD包含在第三个XSD中并使用它进行验证怎么样?
schema3.xsd:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://www.xxxxxxx.com/texxxxxxx"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">

    <xs:include schemaLocation="schema1.xsd"/>
    <xs:include schemaLocation="schema2.xsd"/>
</xs:schema>

相关问题