Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xsd 引用元素而不包括/导入在其中定义元素的schemaLocation_Xsd - Fatal编程技术网

Xsd 引用元素而不包括/导入在其中定义元素的schemaLocation

Xsd 引用元素而不包括/导入在其中定义元素的schemaLocation,xsd,Xsd,我有两个xsd文件。第一个文件是common.xsd,另一个是node.xsd。node.xsd和common.xsd共享相同的targetNamespacecommon.xsd使用ref属性引用节点.xsd中定义的元素。但是,使用include或import时,node.xsd不包括在common.xsd中。但是我使用这些xsd文件验证的XML通过了验证(尝试了所有角落的用例) 我想知道这怎么可能。这是因为它们共享相同的命名空间吗?还引用了元素,但没有在XSD中包含/导入合法元素吗 编辑: 简

我有两个xsd文件。第一个文件是
common.xsd
,另一个是
node.xsd
node.xsd
common.xsd
共享相同的
targetNamespace
common.xsd
使用
ref
属性引用
节点.xsd
中定义的
元素。但是,使用
include
import
时,
node.xsd
不包括在
common.xsd
中。但是我使用这些xsd文件验证的XML通过了验证(尝试了所有角落的用例)

我想知道这怎么可能。这是因为它们共享相同的命名空间吗?还引用了
元素
,但没有在XSD中包含/导入合法元素吗

编辑:

简化的代码片段(实际的xsd要复杂得多,而且出于更大的原因,它们是以这种格式编写的):

common.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:my="my-namespace"
        xmlns:xml="http://www.w3.org/XML/1998/namespace"
        targetNamespace="my-namespace"
        elementFormDefault="qualified">
  <xsd:element name="common" type="my:commonType" />
  <xsd:complexType name="commonType">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="my:node"/>
      <!-- few other elements -->
    </xsd:choice>
  </xsd:complexType>
</xsd:schema>

node.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:my="my-namespace"
        xmlns:xml="http://www.w3.org/XML/1998/namespace"
        targetNamespace="my-namespace"
        elementFormDefault="qualified">
  <xsd:include schemaLocation=common.xsd"/>
  <xsd:element name="node" type="my:nodeType"
           substitutionGroup="my:common" />
  <xsd:complexType name="nodeType">
    <xsd:complexContent>
      <xsd:extension base="my:commonType">
        <!-- some 5-7 attributes -->
        <xsd:anyAttribute/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>


我可以让这看起来更邪恶。。。您可以删除
node.xsd
中的
xsd:include
,仍然可以验证您的XML!看看这个,看看你是如何做到的

其思想是,从规范的角度来看,XML模式处理器可以通过多种方式解析模式位置。这还意味着,当单独查看某些XSD文件时,可能由于悬空引用而无效,但是当通过上述API或自定义解析程序(例如,支持“目录”文件)将放在一起时,结果是一个有效的等效模式

XSD处理器通常的工作方式是,它将所有可通过其可解析的引用加载的模式组件放在一起,然后将结果作为一个整体进行查看,而不管这些组件来自何处。在您的例子中,node.xsd引入了common.xsd;结果是一个有效的模式,因为
common.xsd
中的组件所需的一切都可以在
node.xsd
已经引入的组件中找到

在您的例子中,就好像
common.xsd
中xsd:schema标记的内部内容替换了
node.xsd
中的
xsd:include
。如果你用手做,结果是正确的,对吗


正如我的补充说明,我要指出的是,您展示的代码片段并没有说明
common
substitution组的用法。作为提醒,如果要进行替换,您必须引用替换组的头。

您可以演示代码如何验证XML吗?Arjun,您使用哪个工具来验证实例文档?我使用的是JDeveloper。它表明XML根据模式是有效的。它还显示我的
common.xsd
文件引用了未定义的元素。谢谢!这澄清了很多事情。是的,common.xsd和node.xsd共享一些属性,这就是为什么它被用作替换组的原因。在创建简单模式时忽略了这一点
<my:node>
  <my:node />
  <my:node>
    <my:node />
  </my:node>
</my:node>