2010-03-19 80 views
2

我不是最好的創建XSD模式,因爲這實際上是我的第一個, 我想驗證一個xml,必須看起來像這樣:無法設計xsd模式 - 因爲可變元素名稱

<?xml version="1.0"?> 
<Data> 
    <FIELD name='toto'> 
    <META mono='false' dynamic='false'> 
     <COLUMN1> 
      <REFTABLE>table</REFTABLE> 
      <REFCOLUMN>key_column</REFCOLUMN> 
      <REFLABELCOLUMN>test_column</REFLABELCOLUMN> 
     </COLUMN1> 
     <COLUMN2> 
      <REFTABLE>table</REFTABLE> 
      <REFCOLUMN>key_column</REFCOLUMN> 
      <REFLABELCOLUMN>test_column</REFLABELCOLUMN> 
     </COLUMN2> 
</META> 
<VALUEs> 
    <VALUE>...</VALUE> 
</VALUEs> 
</FIELD> 

我的問題是,到META阻止標籤 「COLUMN1」, 「COLUMN2」 總是不同的,它有可能成爲COLUMNxxx。現在我的模式是:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="Data"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name="FIELD" type="Field" /> 
    </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:int" use="required" /> 
    </xsd:complexType> 
</xsd:element> 

<xsd:complexType name="dataSourceDef"> 
    <xsd:sequence> 
     <xsd:element name="DSD_REFTABLE" type="xsd:string" /> 
     <xsd:element name="DSD_REFCOLUMN" type="xsd:string" /> 
     <xsd:element name="DSD_REFLABELCOLUMN" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="MetaTag"> 
    <xsd:sequence> 
     <xsd:any processContents="lax" /> 
    </xsd:sequence> 
    <xsd:attribute name="mono" type="xsd:string" use="required" /> 
    <xsd:attribute name="dynamic" type="xsd:string" use="required"/> 
</xsd:complexType> 

<xsd:complexType name="Field"> 
    <xsd:sequence> 
     <xsd:element name="META" type="MetaTag" minOccurs="1" /> 
     <xsd:element name="VALUEs"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:any processContents="lax" /> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string" use="required"/> 
</xsd:complexType> 
</xsd:schema> 

,我只是無法得到它的工作,我不知道如何處理這樣的事實,我的節點的精確程度不明確,剩下的就是。

你能幫我嗎?

回答

0

我認爲問題在於,在您的模式中,<xsd:any/>只會接受一個單一元素。你需要告訴可以有任意數量的兒童與屬性的minOccursmaxOccurs的

<xsd:sequence> 
    <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
</xsd:sequence> 
3

您不能擁有這樣的文檔並根據XML模式進行驗證。使用

<COLUMN name="Column1"/> 

代替。

+0

有什麼辦法「不」驗證這一部分並驗證休息,像元屬性和所有。也許使用xsd:any元素? – 2010-03-19 14:04:54