2013-08-27 2 views
0

Я хочу, чтобы проверить данные, как в ниже массива:Как создать хз: выбор внутри хз: все - (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 там, first_name и last_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

Вы добавляете элемент gender к той же структуре XML? Можете ли вы поделиться всей структурой XML? – herry

+0

' Имя Фамилия ' – Nishikant

1

Самый простой подход, вероятно, переименовать boy_id и girl_id к полу (с соответствующим значением атрибута), как это было предложено @herry. Если вы не хотите, чтобы это сделать (? Почему нет), то ваши остальные варианты включают в себя:

  • объявить абстрактный элемент gender_id, поместите его в все-группу, и объявить boy_id и girl_id как в замещении группа;
  • переименовать ограждающий элемент из «XML» в «девушки» или «мальчика», чтобы нести информацию о том, что вы имеете дело с девушкой или мальчиком

Есть несомненные другие, некоторые из которых будет чувствовать идиоматический для Java-программистов, и некоторые из них будут чувствовать себя идиоматичными для пользователей XML.

Смежные вопросы