XSD элемент не может содержать текст. модель содержимого пуста после добавления xs:unique

#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>