Создание XSD для проверки XML - PullRequest
0 голосов
/ 18 января 2019

У меня ниже xml, который в основном содержит тестовые данные, необходимые для автоматических тестов. Ранее мы использовали xls, но поскольку управление версиями в GIT затруднительно, мы хотим перейти на XML. Теперь проблема в том, что в XLS все строки всегда согласованы (они имеют одинаковый заголовок), но в XML возможно, что member1 добавляет строку-1 с 2 параметрами, а member2 добавляет строку-2 с 4 параметрами. так как количество строк увеличивается, трудно увидеть, какие параметры уже существуют. В Excel мы можем просто проверить заголовок. Я хотел бы ограничить xml, чтобы иметь одинаковые параметры для всех строк в одном узле таблицы данных. Может кто-нибудь сказать мне, как создать XSD для этого? Я новичок в XML.

<?xml version = "1.0"? >
<Workbook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Sample.xsd" >
   <Datasheet name = "sheet1">
    <Row rowid="1">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </Row>
   <Row rowid="1">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </Row>
   <Row rowid="2">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </Row>
   </Datasheet>

   <Datasheet name = "sheet2">
    <Row rowid="2">
      <firstname2>Vaneet</firstname2>
      <lastname2>Gupta</lastname2>
      <nickname2>vinni</nickname2>
      <marks2>95</marks2>
   </Row>
   </Datasheet>


</Workbook>

Ответы [ 2 ]

0 голосов
/ 18 января 2019

В XSD 1.1 вы можете требовать, чтобы все строки соответствовали:

<xs:element name="rows">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="row" maxOccurs="unbounded"/>
        <xs:complexType>
          <xs:sequence>
            <xs:any maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:assert test="every $h in head(rows), $t in tail(rows) 
                     satisfies deep-equal($h/*/node-name(.), $t/*/node-name(.)"/>
  </xs:complexType>
</xs:element>

Невозможно определить это ограничение с помощью XSD 1.0.

0 голосов
/ 18 января 2019

Это простой пример учебника, чтобы узнать, как это сделать: XSD How To?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
       <xs:element name="Workbook">
              <xs:complexType>
                     <xs:sequence>
                            <xs:element name="Datasheet" maxOccurs="unbounded">
                                   <xs:complexType>
                                          <xs:sequence>
                                                 <xs:element name="Row" maxOccurs="unbounded">
                                                        <xs:complexType>
                                                               <xs:sequence>
                                                                      <xs:element name="firstname" type="xs:string"></xs:element>
                                                                      <xs:element name="lastname" type="xs:string"></xs:element>
                                                                      <xs:element name="nickname" type="xs:string"></xs:element>
                                                                      <xs:element name="marks" type="xs:int"></xs:element>
                                                                  </xs:sequence>
                                                               <xs:attribute name="rowid" type="xs:int"></xs:attribute>
                                                           </xs:complexType>
                                                    </xs:element>
                                             </xs:sequence>
                                          <xs:attribute name="name" type="xs:string"></xs:attribute>
                                      </xs:complexType>
                               </xs:element>
                        </xs:sequence>
                     <xs:attribute name="xmlns:xsi" type="xs:string"></xs:attribute>
                     <xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string"></xs:attribute>
                 </xs:complexType>
          </xs:element>
   </xs:schema>
...