2011-01-14 2 views
1

По какой-то причине я не могу получить nillable, чтобы корректно работать с валидатором схемы .Net. Я пытаюсь найти способ сделать родительский узел необязательным, но в то же время препятствовать прохождению пустого узла через валидатор.Scama Validator "nillable" для детских узлов не работает?

Вот текущий элемент валидатор:

<xs:element name="Dates" minOccurs="0" maxOccurs="1"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="From" type="datetime" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="To" type="datetime" minOccurs="0" maxOccurs="1" /> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

Я попытался изменить ДАТЫ элемент nillable = «ложь», но это не работает - пустой узел до сих пор делает его прошлое валидатор.

Я также попытался сменить все три элемента на nillable = "false" - который отлично работает для обнаружения пустого родительского узла, но приводит к тому, что оба пользователя становятся требуемыми узлами, а не остаются необязательными.

Так что я что-то пропустил? Да, я всегда могу просто набросить на него код и заставить его работать ... но я уверен, что здесь есть вариации в объявлениях схемы, которые дадут мне то, что мне нужно.

ответ

1

решение в вашем случае является "множественный выбор":

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Dates" minOccurs="0" maxOccurs="1"> 
        <xs:complexType> 
         <xs:choice minOccurs="1" maxOccurs="2"> 
          <xs:choice maxOccurs="1"> 
           <xs:element name="From" type="xs:dateTime" /> 
          </xs:choice> 
          <xs:choice maxOccurs="1"> 
           <xs:element name="To" type="xs:dateTime" /> 
          </xs:choice> 
         </xs:choice> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

действительные документы

<?xml version="1.0"?> 
<root> 
    <Dates> 
     <From>2010-01-20T12:34:45</From> 
     <To>2011-01-20T12:34:45</To> 
    </Dates> 
</root> 


<?xml version="1.0"?> 
<root> 
    <Dates> 
     <From>2010-01-20T12:34:45</From> 
    </Dates> 
</root> 


<?xml version="1.0"?> 
<root> 
    <Dates> 
     <To>2011-01-20T12:34:45</To> 
    </Dates> 
</root> 

недействительным документ

<?xml version="1.0"?> 
<root> 
    <Dates/> 
</root> 

Простой способ

<xs:element name="Dates" minOccurs="0" maxOccurs="1"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any minOccurs="1" maxOccurs="2" processContents="lax" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Где ваш единственный способ соблюдения <From /> и <To /> будет использовать специальное пространство имен.

+0

Очень близко, я думаю, но ваш первый пример (с From/To nodes) не прошел проверку (см. Http://www.xmlforasp.net/SchemaValidator.aspx). Это похоже на его заголовок в правильном направлении, но когда я возился с вашей схемой на сайте валидатора схемы, я только что усугубил ситуацию. :-) – jerhewet

+0

@jerhewet Ты действительно прав. В опубликованной версии отсутствует 'maxOccurs =" 2 "' для внешнего 'choice'. – Filburt

+0

Вы * - * Да, человек! Или, может быть, женщина Да, но в любом случае/пол это КАЗИТАНО, что я искал! Очень счастливый турист! – jerhewet

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