Проверка XML через схему - PullRequest
0 голосов
/ 29 октября 2018

Ниже приведен xml, из которого мне нужно создать схему xml (файл xsd), проверяющую имя поля, т.е. в узле tableData (ниже xml), имя первого столбца должно быть «field» с ключом как « name "и его значение должно быть" Data1 ". Я также хочу проверить, что значение этого столбца должно иметь тип xs: integer (значение равно 123). Точно так же нужно для всех столбцов таблицы. Я новичок в проверке XML, поэтому возникают проблемы.

XML:

<table name="Employee">
    <tableData>
      <field name="Data1">123</field>
      <field name="Data2">234</field>
      <field name="Data3">Y</field>
      <field name="Data4">321</field>
    </tableData>
</table>

Я пытался создать схему, но не смог проверить тип 123 (то есть xs: integer) и другие типы столбцов. Пожалуйста, если кто-то может дать подсказку по этому вопросу.

Схема, которую я пробовал:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
          xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="tableData" >
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="4" name="field" type="fieldType" minOccurs="4"/>
      </xs:sequence>
    </xs:complexType>
    </xs:element>

  <xs:complexType name="fieldType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="validAttributeType" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:simpleType name="validAttributeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Data1"/>
      <xs:enumeration value="Data2"/>
      <xs:enumeration value="Data3"/>
      <xs:enumeration value="Data4" />
    </xs:restriction>
  </xs:simpleType>

  </schema>

Кроме того, для таблицы name = "Employee" в xml (первая строка в xml) я попытался создать схему и добавить ее до схемы, о которой я упоминал выше, но это дает ошибку: элемент 'table' не может содержать дочерний элемент 'tableData', потому что модель содержимого родительского элемента - только текст. Схема, которую я добавил выше схемы, упомянутой выше:

   <xs:element name="table" type="mTable"/>
      <xs:complexType name="mTable" >
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="name" type="xs:string" fixed="Employee"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

1 Ответ

0 голосов
/ 29 октября 2018

К сожалению, вы решили представлять данные как <field name="data1">123</field>, а не как простой <data1>123</data1>, потому что это очень затрудняет написание схемы XSD для данных. В XSD правила проверки определяются именем элемента.

Есть обходные пути:

  • в XSD 1.1 вы можете использовать «условное присвоение типа» для назначения типа элементу, который зависит от значений его атрибутов. Но многие процессоры XSD не поддерживают XSD 1.1

  • вы можете преобразовать данные в более простую форму перед их проверкой. Но тогда диагностика схемы будет относиться к преобразованному документу, а не к оригиналу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...