2016-03-23 98 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文件,但是現在一切正常。 –