#xml #xsd
#xml #xsd
Вопрос:
Ниже приведен мой XML и проверяющий XSD. похоже, что с моим xs:unique
ограничением для id
поля что-то не так.
<?xml version='1.0' encoding='utf-8'?>
<records>
<record>
<date>2016-02-01</date>
<id>3</id>
</record>
<record>
<date>2016-02-01</date>
<id>4</id>
</record>
<record>
<date>2016-02-01</date>
<id>7</id>
</record>
</records>
XSD:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:date" name="date"/>
<xs:element name="id" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="recordid" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="Unique-id">
<xs:selector xpath="id" />
<xs:field xpath="@recordid" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Ответ №1:
Ваш XSD не совсем связан с вашим XML: в вашем XSD вы упоминаете атрибут recordid, который не существует в вашем коде
Предположим, что ваш XML правильный, вот соответствующий XSD, который должен дать вам правильный результат
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="record" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:date" name="date"/>
<xs:element name="id" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="Unique-id">
<xs:selector xpath="record" />
<xs:field xpath="id" />
</xs:unique>
</xs:element>
Комментарии:
1. Это проверяется на уровне записи, т. Е. Когда я получаю ошибку, номер строки указывает на элемент родительского уровня <запись>, а не на дочерний элемент <идентификатор>. Могу ли я в любом случае проверить дочерний элемент напрямую? Я использую номер строки ошибки для целей отображения.
Ответ №2:
У меня такая же проблема с XML, как:
<SomeRoot>
<SomeElement SomeAttribute="1"></SomeElement>
</SomeRoot>
Проблема была в теге someElement, он содержит пустую строку, которая считается текстом. Итак, решением для меня было — использовать тег self close:
<SomeRoot>
<SomeElement SomeAttribute="1" />
</SomeRoot>