2016-10-20 3 views
0

Дано:Является ли maxoccurs необходимым для сложных типов в XML?

<?xml version="1.0" encoding="utf-8"?> 
<Clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Client> 
     <ClientCode>400057</ClientCode> 
    <Notes> 
     <Note> 
     <Text>This is a note</Text> 
     </Note> 
    </Notes> 
    </Client> 
    <Client> 
     <ClientCode>101134</ClientCode> 
    <Notes> 
     <Note> 
     <Text>This is a note too</Text> 
     </Note> 
    </Notes> 
    </Client> 
</Clients> 

И схемы XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    attributeFormDefault="unqualified" elementFormDefault="qualified" 
    version="1.0"> 
    <xsd:element name="Clients"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Client" maxOccurs="3"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="ClientCode" type="xsd:string"/> 
          <xsd:element name="Notes"> 
           <xsd:complexType> 
            <xsd:sequence> 
             <xsd:element name="Note" nillable="true"> 
              <xsd:complexType> 
               <xsd:sequence> 
                <xsd:element name="Text" 
                 nillable="true" 
                 type="xsd:string"/> 
               </xsd:sequence> 
              </xsd:complexType> 
             </xsd:element> 
            </xsd:sequence> 
           </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

ли клиент требует MaxOccurs значение для обеспечения более одного клиента в файле XML. Каждый валидатор, который я могу найти, проверяет XML с несколькими клиентами, но maxoccurs не упоминается.

ответ

1

Что-то не хватает в вашей схеме; вы определили Clients как <xsd:element name="Clients" />. Он не напечатан, поэтому он занижен, что он может иметь любой контент (xs:anyType). Измените его на:

<xsd:element name="Clients"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element ref="FileDate"/> 
      <xsd:element ref="Client"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

, и вы увидите некоторые ошибки появляются потому, что валидатор находит более одного Client.

Когда не указано иное, следует понимать, что атрибуты minOccurs и maxOccurs устанавливаются в 1.

Чтобы разрешить несколько Client дочерних элементов, вы можете изменить свое заявление следующим образом:

<xsd:element name="Clients"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element ref="FileDate"/> 
      <xsd:element ref="Client" minOccurs="1" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
+0

Я думаю, Возможно, я неправильно сформулировал вопрос. Этот XML передает все проверки, которые я могу найти, - я не могу понять, почему. Это позволяет мне иметь несколько элементов Client и Note в документе экземпляра XML. Это позволяет это произойти БЕЗ maxOccurs = "неограниченный". Зачем? –

+0

Итак, чтобы быть ясным, я удалил те предметы, которые вы указали, и они все еще проходят проверку. Это то, чего я не могу понять. –

+0

@ DanielDevine вот что я объяснил в первом предложении. «Клиенты» определяются с помощью ', здесь вы не указываете какую-либо конкретную модель контента для этого тега. Таким образом, считается, что любой/любой хорошо сформированный XML действителен. Если вам необходимо ограничить содержимое «Клиентов» только элементами «Клиент», вы должны ** определить модель контента для этого элемента. Там вы сможете установить min/maxOccurs (среди прочего) – potame

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