2017-02-13 11 views
2

Я хочу написать схему, которая проверяет мой следующий XMLХочет написать схему для XML-файла

<labtest> 
    <labtest_id1>10190</labtest_id1> 
    <labtest_id2> 10200</labtest_id2> 
    <labtest_id3> 10220</labtest_id3> 
</labtest> 

Количество тегов <labtest_id> может увеличиваться или уменьшаться. Я проверить, как это, но он не работает

<xs:element name="labtest" minOccurs="1" maxOccurs="unbounded"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="labtest_id" minOccurs="1" type="xs:decimal"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
+0

Возможный дубликат [этот вопрос] (http://stackoverflow.com/questions/943659/how-can-i-define-an-xsd-file-that-allows-unknown-wildcard-elements) –

+0

Никогда не говорите нам, что что-то «не работает». Расскажите, как это не получается. –

+0

Он не работает, поскольку он говорит, что labtest_id 2 нет. Поэтому я хочу пропустить проверку на labtest – amanda

ответ

2

Изменить дизайн XML, как Майкл Кей рекомендует и по-прежнему поддерживать несколько labtest элементов, а также множественным labtest_id элементы:

Это XML,

<?xml version="1.0" encoding="UTF-8"?> 
<labtests> 
    <labtest> 
    <labtest_id>10190</labtest_id> 
    <labtest_id>10200</labtest_id> 
    <labtest_id>10220</labtest_id> 
    </labtest> 
    <labtest> 
    <labtest_id>12345</labtest_id> 
    </labtest> 
</labtests> 

будет успешно подтвердить против этой XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="labtests"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="labtest" minOccurs="1" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="labtest_id" minOccurs="1" 
          maxOccurs="unbounded" type="xs:decimal"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Примечания:

  • Вы хотите labtest повторить, но может быть только один корневой элемент в хорошо сформированный XML, поэтому добавьте элемент labtests обертку.
  • Вы хотите, чтобы labtest_id повторялся, поэтому добавьте maxOccurs="unbounded" в свою декларацию.
3

Если вы хотите наложить ограничение, что все дети labtest должна называться labtest_N, где N является целым числом, это то, что вы не можете сделать с XSD (за исключением возможно, используя XSD 1.1 с утверждениями).

Это ужасный способ использования XML, и самое лучшее, что нужно сделать, это первое, чтобы превратить его в нечто здравом с помощью XSLT, например, для:

<labtests> 
    <labtest id='1'>10190</labtest> 
    <labtest id='2'>10200</labtest> 
    <labtest id='3'>10220</labtest> 
</labtests> 

, а затем проверить результат с помощью XSD.

+0

Но количество тегов labtest неизвестно может увеличиваться, так что это не решение @micheal kay – amanda

+0

@Micheal, как я могу пропустить проверку на labtest с помощью пропустить? – amanda

+0

Именно поэтому количество тегов labtest неизвестно, что вам лучше использовать другую структуру. XSD предназначен для проверки документов с использованием фиксированного конечного словаря имен тегов. –