Xsd XML模式中的递归?

Xsd XML模式中的递归?,xsd,Xsd,我需要创建一个XML模式来验证XML文档的树结构。我不知道这棵树的确切位置或深度 XML示例: <?xml version="1.0" encoding="utf-8"?> <node> <attribute/> <node> <attribute/> <node/> </node> </node> 验证它的最佳方法是什么?递归?XSD确实允许元素的递归

我需要创建一个XML模式来验证XML文档的树结构。我不知道这棵树的确切位置或深度

XML示例:

<?xml version="1.0" encoding="utf-8"?>
<node>
  <attribute/>
  <node>
    <attribute/>
    <node/>      
  </node>
</node> 


验证它的最佳方法是什么?递归?

XSD确实允许元素的递归。这里



正如您所看到的,section元素包含一个section类型的子元素。

如果需要递归类型声明,下面的示例可能会有所帮助:

<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="node" type="nodeType"></xs:element>

  <xs:complexType name="nodeType">    
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="node" type="nodeType"></xs:element>
    </xs:sequence>
  </xs:complexType>

</xs:schema>


如您所见,这定义了一个递归模式,其中只有一个名为“node”的节点,其深度可以达到所需的深度。

其他解决方案非常适合使根元素递归。然而,为了使非根元素递归而不在过程中将其转换为有效的根元素,需要一种稍微不同的方法

假设您想定义一种XML消息格式,用于在分布式应用程序中的节点之间交换结构化数据。它包含以下元素:

  • -根元素
  • -消息的来源
  • -消息的目的地
  • -消息中编码的数据结构类型
  • -消息中包含的数据
为了支持复杂的数据类型,
是一个递归元素。这使得编写以下信息成为可能,例如向飞行无人机发送信息,指定其线性和角度(即旋转)速度:


控制器:8080
无人机:8080
几何图形\u msgs/TwistStamped
0
1.
0
基本链路
1
0
1
0.3
0
0
我们可以轻松编写XML模式来验证此格式:


上面的模式的问题是它使
成为根元素,这意味着它还验证下面的文档:


0
1.
0
基本链路
1
0
1
0.3
0
0
为了避免这种副作用,我们不是直接在全局级别定义
元素,而是首先定义
数据
类型,然后在
消息中定义该类型的
数据
元素:



请注意,我们最终不得不定义
元素两次,一次在
数据类型中,一次在
类型中,但除了一些工作重复之外,这并不重要。

+1我相信这是一个比公认的更好的解决方案,因为它允许递归元素成为一个复杂类型。@Harriv,XSD(XML架构定义)不是DTD。有关区别,请参阅“也许知道您只能在全局元素上使用ref属性很有用”,如这里所指出的:
minOccurs=“0”
是keyURL链接已关闭。
<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="node" type="nodeType"></xs:element>

  <xs:complexType name="nodeType">    
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="node" type="nodeType"></xs:element>
    </xs:sequence>
  </xs:complexType>

</xs:schema>