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