Очень странная XML проблема схемы - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь проанализировать пользовательские форматы XML файлов с помощью PyXB. Итак, я сначала написал следующую XML схему:

<?xml version="1.0"?>                                                           
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">                         
    <xs:element name="outertag" minOccurs="0" maxOccurs="1">                    
        <xs:complexType>                                                        
            <xs:all>                                                            
                <xs:element name="innertag0"                                    
                            minOccurs="0"                                       
                            maxOccurs="unbounded"/>                             
                <xs:element name="innertag1"                                    
                            minOccurs="0"                                       
                            maxOccurs="unbounded"/>                             
            </xs:all>                                                           
        </xs:complexType>                                                       
    </xs:element>                                                               
</xs:schema>

Я использовал следующую команду pyxbgen для генерации источника Python модуля, py_schema_module.py:

pyxbgen -m py_schema_module -u schema.xsd

I затем написал следующий скрипт для разбора файла XML, который я называю примером. xml:

#!/usr/bin/env python2.7                                                        

import py_schema_module                                                         

if __name__ == "__main__":                                                      
    with open("example.xml", "r") as f:                                         
        py_schema_module.CreateFromDocument(f.read())

Я использую этот скрипт для определения законности примера. Синтаксис xml. Например, в следующем примере. xml файл имеет допустимый синтаксис для схемы:

<outertag>                                                                      
    <innertag0></innertag0>                                                     
    <innertag1></innertag1>                                                     
</outertag>

Так же:

<outertag>                                                                      
    <innertag1></innertag1>                                                     
    <innertag0></innertag0>                                                     
</outertag>

Однако следующий синтаксис недопустим:

<outertag>                                                                      
    <innertag1></innertag1>                                                     
    <innertag0></innertag0>                                                     
    <innertag1></innertag1>                                                     
</outertag>

Вот так:

<outertag>                                                                      
    <innertag0></innertag0>                                                     
    <innertag1></innertag1>                                                     
    <innertag0></innertag0>                                                     
</outertag>

Я могу написать innertag0, а затем innertag1. Я также могу написать innertag1 и затем innertag0. Я также могу произвольно повторять экземпляры innertag0 и innertag1 (примеры для краткости не приводятся). Однако я не могу переключаться между innertag0 и innertag1.

Предположим, я хочу, чтобы формат поддерживал эту функцию. Как мне изменить мой XML файл схемы?

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Ваш процессор схемы, похоже, не очень тщательно проверяет спецификацию c.

Если я попытаюсь обработать вашу схему как схему XSD 1.0 с Saxon, она скажет мне, что есть четыре ошибки:

Error at xs:element on line 3 column 59 of test.xsd:
  Attribute @minOccurs is not allowed on element <xs:element>
Error at xs:element on line 3 column 59 of test.xsd:
  Attribute @maxOccurs is not allowed on element <xs:element>
Error at xs:all on line 5 column 15 of test.xsd:
  Within <xs:all>, an <xs:element> must have @maxOccurs equal to 0 or 1
Error at xs:all on line 5 column 15 of test.xsd:
  Within <xs:all>, an <xs:element> must have @maxOccurs equal to 0 or 1
Schema processing failed: 4 errors were found while processing the schema

Первые два говорят, что minOccurs и maxOccurs недопустимы в глобальном объявлении элемента.

Вторые два говорят, что maxOccurs должно быть 1 в пределах xs:all - XSD 1.0 не позволяет элементу повторяться, когда модель контента xs:all. Ваш процессор сказал вам, что это ошибка в экземпляре XML, но на самом деле это ошибка в вашей схеме.

XSD 1.1 допускает множественные вхождения в xs:all. Если я исправлю объявление глобального элемента, удалив @minOccurs и @maxOccurs, схема теперь будет действительна в XSD 1.1 и разрешит примеры чередующихся экземпляров, с которыми у вас возникли проблемы.

0 голосов
/ 03 марта 2020

Следующая XML схема (XSD) 1.0 должна охватывать ваш вариант использования независимо от последовательного порядка элемента innertag (0 | 1). Значение по умолчанию для minOccurs и maxOccurs равно 1.

Полезная ссылка: XML схема, почему xs: group не может быть дочерней по отношению к xs: all?

XML

<outertag>
    <innertag1></innertag1>
    <innertag0></innertag0>
</outertag>

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="outertag">
        <xs:complexType>
            <xs:all>
                <xs:element name="innertag0" type="xs:string"/>
                <xs:element name="innertag1" type="xs:string"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
...