Элемент XML и проверка XSD, которая содержит как атрибут, так и текст

Я пытаюсь понять, как структурировать мою проверку XSD, чтобы она правильно проверяла мой XML-файл.

Моя стихия languages содержать элементы language который содержит как текст, так и id поле.

Мой валидатор говорит мне, что у меня: Validation Error: The element 'languages' has invalid child element 'language'.

Как правильно это структурировать? мне вообще нужно complexType для меня language элемент?

XSD

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="dataset">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="languages">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="language">
                                <xsd:complexType mixed="true">
                                    <xsd:simpleContent>
                                        <xsd:extension base="xsd:string">
                                            <xsd:attribute name="id" type="xsd:integer"/>
                                        </xsd:extension>
                                    </xsd:simpleContent>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<dataset>
    <languages>
        <language id="0">C</language>
        <language id="1">C++</language> 
    </languages>
</dataset>

1 ответ

Решение

Следующий XSD проверит ваш XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="dataset">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="languages">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="language" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="id">
                      </xs:attribute>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Заметки:

  • Сообщение об ошибке было связано с количеством элементов (maxOccurs="unbounded").
  • Вы можете не хотеть mixed="true" если language Предполагается, что возможная разметка смешивается с текстом в его содержимом.
Другие вопросы по тегам