2013-08-27 75 views
0

我想驗證數據如下排列:如何創建的xs:裏面選擇XS:所有 - (XSD:架構)

input_array = array(
    "boy"=> array("boy_id"=>1), 
    "first_name=>"First Name", 
    "last_name"=>"Last Name" 
); 

內input_array第一索引可以與女孩陣列來代替,

"girl"=>array("girl_id"=>2) 

我想創建的XSD如下驗證信息:

<xs:element name="xml"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element ref="boy" minOccurs="0"/> 
     <xs:element ref="girl" minOccurs="0"/> 
     <xs:element ref="first_name"/> 
     <xs:element ref="last_name"/> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

問題 - 我想,以確保無論是男孩還是女孩的Infor mation在那裏,first_namelast_name將永遠在那裏,我怎麼能把他們(女孩,男孩)作爲選擇或選擇。我寧願使用xs:all,以便元素順序不應該是一個問題。

我推薦這個link使用,以嘗試使用xs:all內的選擇,但不能得到它的工作。我會很感激任何迴應。謝謝。

回答

3

在你參考的文章(http://www.w3.org/wiki/Needs_choice_inside_all) 他們提供了一個替代組的例子。那麼,爲什麼不使用它呢?

下面是它應該是什麼樣子:

<xs:element name="xml"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element ref="gender" minOccurs="1"/> 
     <xs:element ref="first_name"/> 
     <xs:element ref="last_name"/> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 

<xs:element name="gender" abstract="true"/> 
<xs:element name="boy" substitutionGroup="gender"> ... </xs:element> 
<xs:element name="girl" substitutionGroup="gender"> ... </xs:element> 

具體來說,我想這個完整的模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="xml"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element ref="gender" minOccurs="1"/> 
     <xs:element ref="first_name"/> 
     <xs:element ref="last_name"/> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="gender" abstract="true"/> 
    <xs:element name="boy" substitutionGroup="gender"/> 
    <xs:element name="girl" substitutionGroup="gender"/> 

    <xs:element name="first_name" type="xs:string"/> 
    <xs:element name="last_name" type="xs:string"/> 
</xs:schema> 

來驗證這個XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
    <girl/> 
    <first_name>Lara</first_name> 
    <last_name>Croft</last_name> 
</xml> 

它的工作!在那裏,如果代替<girl/>我指定<boy/>,它也通過, 但沒有<girl/>不是<boy/>或它們中的任何一起。

+0

非常感謝,它的工作就像一個魅力! – Nishikant

1

你可以試試這段代碼嗎?

<xsd:complexType name="column"> 
    <xsd:all> 
    <xsd:element ref="gender" minOccurs="1"/> 
    <xs:element name="firstname" type="xs:string"/> 
    <xs:element name="lastname" type="xs:string"/> 
    </xsd:all> 
</xsd:complexType> 


<xsd:element name="gender"> 
    <xsd:complexType> 
    <xsd:choice> 
    <xs:element name="boy" type="xs:integer" default="1"/> 
    <xs:element name="girl" type="xs:integer" default="0"/> 
    </xsd:choice> 
    </xsd:complexType> 
</xsd:element> 
+0

感謝您的評論,不幸的是解決方案不工作,因爲我得到的錯誤說性別因素沒有在我的數組中找到我通過任何男孩或女孩,有沒有辦法解決這個問題? – Nishikant

+0

你是否將性別元素添加到相同的XML結構?你能分享所有的XML結構嗎? – herry

+0

'<?xml version =「1.0」encoding =「utf-8」?> 名字 ' – Nishikant

1

的最簡單的方法可能是重命名boy_id和girl_id性別(與適當的屬性值),由@herry的建議。如果你不希望這樣做(爲什麼不呢?),那麼你剩下的選項包括:

  • 聲明一個抽象元素gender_id,放入所有組,並宣佈boy_id和girl_id作爲其替代是組;
  • 重命名從「XML」爲「姑娘」或「男孩的包覆件進行有關是否正在處理一個男孩還是女孩的信息

有無疑別人,有些會覺得對於Java程序員來說是慣用的,其中一些對於XML用戶來說會很習慣。