在XML模式中递归?

12 浏览
0 Comments

在XML模式中递归?

我需要创建一个验证XML文档树结构的XML模式。我不知道树的出现次数或深度级别。

XML示例:



  
  
    
          
  
 

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

0
0 Comments

递归在XML模式中的使用是为了实现非根元素的递归。然而,为了在不将其转换为有效的根元素的同时使非根元素递归,需要采用稍微不同的方法。

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

- `` - 根元素;

- `` - 消息的来源;

- `` - 消息的目标;

- `` - 编码在消息中的数据结构类型;

- `` - 消息中包含的数据。

为了支持复杂的数据类型,``是一个递归元素。这使得可以像下面这样编写消息,以便向飞行无人机发送一个`geometry_msgs/TwistStamped`消息,指定其线性和角速度:



  controller:8080
  drone:8080
  geometry_msgs/TwistStamped
  
    0
    
      1
      0
    
    base_link
  
  
    
      1.0
      0
      1.0
    
    
      0.3
      0
      0
    
  

我们可以很容易地编写一个XML模式来验证这种格式:



  
    
      
        
      
      
    
  
  
    
      
        
        
        
        
      
    
  

上述模式的问题是它将``作为根元素,这意味着它还验证了下面的文档:



  
    0
    
      1
      0
    
    base_link
  
  
    
      1.0
      0
      1.0
    
    
      0.3
      0
      0
    
  

为了避免这种副作用,我们首先定义一个`data`类型,然后在`message`内部定义一个该类型的`data`元素:



  
    
      
    
    
  
  
    
      
        
        
        
        
      
    
  

请注意,我们最终不得不两次定义``元素 - 一次在`data`类型内部,再次在``内部 - 但除了一些工作重复之外,这没有任何影响。

0
0 Comments

XML模式定义(XML Schema Definition,XSD)确实允许元素的递归。下面是一个示例:


  
    
      
      
      
    
  

如上所示,`section`元素包含一个类型为`section`的子元素。

此外,需要注意XSD(XML模式定义)与DTD(文档类型定义)的区别。可以参考这篇文章了解详细的区别:stackoverflow.com/questions/1544200/…

另外,需要注意`ref`属性只能在全局元素上使用,具体可以参考这篇文章:stackoverflow.com/questions/13073265/…

最关键的是`minOccurs="0"`。需要注意的是,URL链接已经失效。

0
0 Comments

递归在XML模式中的使用是为了解决需要定义递归类型的情况。递归类型的定义是指一个元素可以包含相同类型的子元素,这种子元素又可以包含相同类型的子元素,以此类推,形成无限嵌套的结构。

以下是一个递归类型声明的示例:


  
      
    
      
    
  

以上示例定义了一个递归模式,只有一个名为"node"的节点,该节点可以无限嵌套。通过递归模式的定义,可以构建具有任意深度嵌套的XML结构。

递归模式的出现原因是为了处理具有无限嵌套结构的数据。在某些情况下,数据的结构可能是不确定的,可能会出现无限层级的嵌套。通过使用递归模式,可以灵活地定义这种类型的结构,并能够适应任意层级的嵌套。

要解决递归模式的问题,可以使用XML模式语言(XSD)中的复杂类型和序列元素的组合。在上述示例中,通过在`xs:complexType`元素中定义`xs:sequence`元素,可以实现无限嵌套的节点类型。`xs:sequence`元素的`minOccurs`属性可以设置子元素的最小出现次数,`maxOccurs`属性可以设置子元素的最大出现次数。通过将`minOccurs`设置为0和`maxOccurs`设置为无限大,可以实现任意深度的嵌套。

通过上述方法,可以在XML模式中定义递归类型,并灵活地处理具有无限嵌套结构的数据。递归模式的使用可以使数据结构更加灵活和可扩展,适用于处理各种复杂的数据需求。

0