2016-03-23 100 views
1

我想从XML文件创建XSD文件,但由于存在与上层元素具有相同名称的嵌套元素,所以出现错误。该XML文件如下(部分)如下:使用嵌套元素从XML创建XSD

- <comments> 
    - <generalCommentData> 
    <createDate>2016-03-18T07:36:48.272+0100</createDate> 
    <message>Test1</message> 
    ... 
    - <replies> 
    - <generalCommentData> 
     <createDate>2016-03-18T07:36:48.272+0100</createDate> 
     <message>Test2</message> 
     ... 
     <replies /> 
     </generalCommentData> 
     ... 
    </replies> 
    </generalCommentData> 
    </comments> 

基本上这个XML表示可能含有一些回复意见(可包含再次回复评论)的一些意见,但每一个意见其实是generalCommentData

什么我可以做些事情吗?我不习惯使用XML文件,我不知道该怎么做。我甚至不知道我是否正确地解释......

回答

2

下面是你的XML相匹配的XSD:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="comments" type="CommentsType"/> 
    <xsd:complexType name="CommentsType"> 
     <xsd:sequence> 
      <xsd:element name="generalCommentData" type="CommentsDataType" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType>  
    <xsd:complexType name="CommentsDataType"> 
     <xsd:all> 
      <xsd:element name="createDate" type="xsd:dateTime"/> 
      <xsd:element name="message" type="xsd:string"/> 
      <xsd:element name="replies" type="CommentsType"/> 
     </xsd:all> 
    </xsd:complexType> 
</xsd:schema> 

事情需要注意:

  • 你的XML似乎暗示着一个xsd:dateTime应该可以工作。不幸的是,你错过了一个冒号,它应该是2016-03-18T07:36:48.272+01:00;如果确实,这是该数据是这样的,那么使用XSD的改变:日期时间XSD:字符串
  • 您正在寻找如何递归结构采用XSD建模。上面的XSD展示了一种做法,在我看来,它是您在示例中展示的最紧凑的一种。其要点是:

    • 假设你的根元素的内容模型是一样的答复的一个,那么全球型CommentsType可以在两种情况下可以重复使用。
    • 通过重复使用评论类型你实现递归。
    • 您的示例XML似乎意味着回复元素是强制性的。
    • 与大多数递归概念一样,期望算法/结构最终会结束。在我的示例中,这是通过使可选的generalCommentData来实现的。没有这些,就无法构建有效的XML。

如果你有不同的约束,例如你的评论元素必须至少有一个元素,那么你的架构将不得不被改变。最简单的方法可能是确保回复元素是可选的(这自然有意义)。如果回复必须是强制性的,那么下面的方法将工作,而不是:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="comments"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="generalCommentData" maxOccurs="unbounded"/> 
      </xsd:sequence>   
     </xsd:complexType> 
    </xsd:element>  
    <xsd:element name="generalCommentData"> 
     <xsd:complexType> 
      <xsd:all> 
       <xsd:element name="createDate" type="xsd:dateTime"/> 
       <xsd:element name="message" type="xsd:string"/> 
       <xsd:element name="replies"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element ref="generalCommentData" minOccurs="0" maxOccurs="unbounded"/> 
         </xsd:sequence>   
        </xsd:complexType>     
       </xsd:element> 
      </xsd:all> 
     </xsd:complexType>  
    </xsd:element> 
</xsd:schema> 

这个例子显示了另一种方式来实现递归结构,这将是通过一个元素的引用,这里generalCommentData

还有第三种方法,使用组参考;如果你真的需要这个,我会留给你找到它;只需搜索递归XML模式。

最后,我用xsd:all作为合成器。如果您需要订单或应该重复的元素,请切换到xsd:序列

+0

感谢您的答案:) dateTime实际上是一个字符串,它不是强制性的,每个评论至少有一个答复,这就是正确的。现在我找到了解决问题的方法。我刚刚在Visual Studio中打开了XML文件,并单击了XML> Create Schema。这对我来说非常美丽。之前,我想使用VIsual studio的命令行工具从XML中创建XSD文件,但是现在一切正常。 –