Ошибка XSD: содержимое символов недопустимо, поскольку тип содержимого пустой

#xml #xsd

#xml #xsd

Вопрос:

Я получаю ошибку проверки из следующего XSD:

 <?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="People">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Person" maxOccurs="unbounded">
                 <xsd:complexType>
                    <xsd:attribute name="name" type="xsd:string" use="required" />
                 </xsd:complexType>
             </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>
  

при использовании следующего XML для проверки:

 <?xml version="1.0" ?>
<People>
    <Person name='john'>
        a nice person
    </Person>
    <Person name='sarah'>
        a very nice person
    </Person>
    <Person name='chris'>
        the nicest person in the world
   </Person>
</People>
  

Возвращает следующую ошибку:

 lxml.etree.XMLSyntaxError: Element 'Person': Character content is not allowed, because the content type is empty.
  

Что я упускаю?

Ответ №1:

Это говорит о том, что «Person» не может включать строку. Для проверки xml с помощью этого xsd используйте это :

 <?xml version="1.0" ?>
<People>
    <Person name='john'>
    </Person>
    <Person name='sarah'>
    </Person>
    <Person name='chris'>
   </Person>
</People>
  

Попробуйте это для xsd для проверки :

 <?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="People">
      <xsd:complexType>
         <xsd:sequence>
         <xsd:element name="Person" type="Person" maxOccurs="unbounded"/>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>

   <xsd:complexType name="Person">
     <xsd:simpleContent>
        <xsd:extension base="xsd:string">
           <xsd:attribute name="name" type="xsd:string" use="required" />
        </xsd:extension>
    </xsd:simpleContent>
   </xsd:complexType>
</xsd:schema>
  

Комментарии:

1. Что мне нужно добавить в XSD, чтобы добавить строки в XML (под элементом Person)?

2. Отредактировал мой пост. Пожалуйста, проверьте.

Ответ №2:

Если XML указан правильно и вы хотите, чтобы XSD поддерживал строковое содержимое (с другими дочерними элементами или без них), вы можете просто добавить mixed=true атрибут complexType:

 <?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="People">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Person" maxOccurs="unbounded">
                 <xsd:complexType mixed="true">
                    <xsd:attribute name="name" type="xsd:string" use="required" />
                 </xsd:complexType>
             </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>
  

Атрибут mixed :

Указывает, разрешено ли отображение символьных данных между дочерними элементами этого элемента complexType . По умолчанию значение false . Если элемент simpleContent является дочерним элементом, атрибут mixed не допускается!

Ответ №3:

Для меня ошибка была решена, когда я добавил элемент значения к сложному типу, который раньше имел только атрибут.