2016-03-23 21 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-Filesの作業に慣れていないので、何をすべきか分かりません。注目すべき

<?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> 

物事::私が正しく説明している場合私も知りません...以下

答えて

2

があなたのXMLに一致するXSDである

  • あなたのXMLは、ANことを示唆しているようですxsd:dateTimeは動作するはずです。残念ながら、あなたは結腸がありません。2016-03-18T07:36:48.272+01:00です。 XSDにdateTimeの:確かに、それはデータがある方法であれば、その後、XSDの使用を変更するには、XSDを使用して再帰的な構造をモデル化する方法を探している文字列
  • 。上記のXSDは、私の意見ではあなたのサンプルで示したものの中で最もコンパクトな方法の1つを示しています。キーポイントは次のとおりです。

    • は、あなたのルート要素の内容モデルは、応答のものと同じであると仮定すると、その後、世界的なタイプCommentsTypeは両方のケースで再利用することができます。
    • CommentsTypeを再利用することで、再帰性が実現します。
    • サンプルXMLは、の回答要素が必須であることを暗示しているようです。
    • ほとんどの再帰的概念と同様に、アルゴリズム/構造が最終的に終了することが期待されます。私のサンプルでは、​​これはgeneralCommentDataをオプションにすることによって達成されています。これがなければ、有効なXMLを構築することはできません。

たとえば、次のような制約があるとします。 コメント要素には少なくとも1つのgeneralCommentData要素が必要です。スキーマを変更する必要があります。最も簡単な方法は、の返信要素がオプションであることを確認することです(当然意味があります)。

<?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次のようになります。回答が必須でなければならない場合に、以下のアプローチが代わりに動作します。

グループ参照を使用する3つ目の方法があります。あなたが本当にそれを必要とするなら、私はそれを見つけるためにあなたに任せます。再帰的なXMLスキーマを検索するだけです。

最後に、xsd:allをコンポジターとして使用しました。注文や繰り返しが必要な要素が必要な場合は、xsd:sequenceに切り替えてください。

+0

ありがとうございました:) dateTimeは実際には文字列であり、各コメントには少なくとも1つの返信があることが必須ではありません。今私は私の問題の回避策を見つけました。私はVisual StudioでXMLファイルを開き、XML> Create Schemaをクリックしました。それは私のためだけに美しく働いた。以前は、VIsual StudioのCommand-Line-Toolを使ってXMLからXSD-Fileを作成していましたが、これはうまくいきませんでしたが、今はすべて問題ありません。 –

関連する問題