如何为节点树创建xsd模式

本文关键字:创建 xsd 模式 节点 | 更新日期: 2023-09-27 18:12:37

我有一个类:

class Node{
    Public string Name;
    Public Node LeftNode;
    Public Node RightNode;
}

有了这个类,我就可以创建一个节点树,我想用xml表示这个树。

目前我的XML模式看起来像:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Node" >
        <xs:complexType>
            <xs:all>
                <xs:element name="Name" type="xs:string" />
                <xs:element name="RightNode">    
                    <!-- I need help here -->
                 </xs:element>
                <xs:element name="LeftNode">    
                    <!-- I need help here -->
                 </xs:element>
            </xs:all>   
        </xs:complexType>
    </xs:element>
</xs:schema>

由于我在visual studio中有智能,我能够创建以下xml:

<?xml version="1.0" encoding="iso-8859-1"?>
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:noNamespaceSchemaLocation="Path_Where_Xsd_File_IsLocated.xsd">
  <Name>Test></Name>    
  <RightNode></RightNode>    
  <LeftNode></LeftNode>
</Node>

我遇到的问题是,我希望能够有嵌套的孩子。换句话说,我希望能够构造这样的东西:

<?xml version="1.0" encoding="iso-8859-1"?>
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:noNamespaceSchemaLocation="Path_Where_Xsd_File_IsLocated.xsd">
  <Name>Test></Name>    
  <RightNode>
       <Node>
           <Name>SomeChildName</Name>
       </Node>
  </RightNode>    
  <LeftNode></LeftNode>
</Node>

我能够构造这三个,但是当我开始键入子节点时,智能将不能像我想在xml上执行的任何验证一样工作。

我已经试过了:

<xsd:element name="RightNode" >
    <xsd:complexType>
        <xsd:all>
             <xs:element ref="Node">  
        </xsd:all>
    </xsd:complexType>
</xsd:element>

我如何修复我的xml模式(xsd文件),使智能继续与子节点一起工作?

如何为节点树创建xsd模式

听起来您需要的是一个递归XSD。下面是一个可能对你有用的例子:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Node" type="Node"/>
<xs:complexType name="Node">
   <xs:all>
      <xs:element name="Name" type="xs:string" />
      <xs:element name="RightNode" type="Node"/>
      <xs:element name="LeftNode" type="Node"/>
   </xs:all>
</xs:complexType>

您可以在这里找到另一个类似的问题,涉及xsd中的一般递归。