Как установить вложенное использование пространства имен XML - PullRequest
0 голосов
/ 14 сентября 2018

Мы определили пространство имен xmlns:abc="http://example.org/ns/abc" и схему XML для него.Эта XML-схема определяет элементы и типы данных.

Эта abc XML-схема включает в себя

<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">

, что позволяет использовать элементы из другого пространства имен.

Далее мы имеемопределил пространство имен xmlns:testing="http://example.org/ns/testing" и схему XML для него.Эта тестирующая XML-схема импортирует пространство имен abc и его XML-схему на <xs:import namespace="http://example.org/ns/abc" schemaLocation="abc.xsd"/>, поскольку некоторые элементы данных, определенные в пространстве имен abc, должны использоваться для элементов тестового пространства имен.

Наконец, мы создали XMLдокумент, использующий как пространства имен, так и схемы XML:

<rootElement xmlns="http://example.org/ns/abc" xmlns:testing="http://example.org/ns/abc" xsi:schemaLocation="http://example.org/ns/abc abc.xsd http://example.org/ns/testing testing.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <abcElement1>Some text</abcElement1>
    <testing:element1/>
</rootElement>

При проверке этого документа XML мы получаем ошибки "... имя элемента ... уже объявлено", указывая на https://www.w3.org/TR/xmlschema-1/#sch-props-correct

Похоже, что невозможно импортировать пространство имен со своей схемой в другое пространство имен, если это другое пространство имен используется в контексте первого пространства имен / схемы - своего рода его повторное использование.

Есть ли лучший способ вложения пространства имен / схемы abc или единственная альтернатива для разделения пространства имен abc на одно, содержащее только элементы, а другое - новое, содержащее определения типов данных и импортирующее это пространство имен типа данных в тестовое пространство имен /схема?

Вот полные примеры: abc.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://example.org/ns/abc" targetNamespace="http://example.org/ns/abc" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="rootElement">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="abcElement1" type="xs:string" minOccurs="0"/>
                <xs:element name="abcEntity" minOccurs="0" maxOccurs="unbounded"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="EntityType1">
        <xs:sequence>
            <xs:element name="identifier" type="xs:string"/>
            <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

testing.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.org/ns/testing" xmlns:abc="http://example.org/ns/abc" targetNamespace="http://example.org/ns/testing" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:import namespace="http://example.org/ns/abc" schemaLocation="abc.xsd"/>
    <xs:element name="element1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="person" type="abc:EntityType1" minOccurs="0"/>
                <xs:element name="company" type="abc:EntityType1" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Пример документа 1 - ссылки на схемы как локальные файлы:

<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns="http://example.org/ns/abc" xmlns:testing="http://example.org/ns/testing"  xsi:schemaLocation="http://example.org/ns/abc abc.xsd http://example.org/ns/testing testing.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <abcElement1>Some text</abcElement1>
    <testing:element1>
        <testing:person>
            <identifier>http://example.com/entity/134134234</identifier>
        </testing:person>
    </testing:element1>
</rootElement>

... и этот документ может быть проверен, ошибка не выдается.

Затем я загрузилabc.xsd на один из моих веб-сайтов и замените имя локального файла его URL-адресом:

xsi:schemaLocation="http://example.org/ns/abc http://data.newsit.biz/fortesting/abc.xsd http://example.org/ns/testing testing.xsd"

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

Программное обеспечение, используемое для проверки: XMLspy 2018 rel2 sp1

Сообщения об ошибках:

  • Недопустимый файл exampleDocument2.xml
  • Схемы, на которые ссылаются атрибуты xsi: schemaLocation или xsi: noNamespaceSchemaLocation в элементе, недопустимы.
  • 'abc: rootElement' уже объявлен.
  • ссылка на https://www.w3.org/TR/xmlschema-1/#sch-props-correct
  • Это "... уже объявлено, и ссылка показана также для abc: EntityType1

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Поддержка Altova предоставила это объяснение для сгенерированной ошибки:

Файл testing.xsd определяет с помощью xs: импортировать расположение XML-схемы abc как (локальное) abc.xsd, как файл строгого URL: //abc.xsd

exampleDocument1 определяет с помощью xsi: schemaLocation расположение XML-схемы abc как (локальное) abc.xsd, как файл строгого URL: //abc.xsd

InВ этом контексте расположение схемы abc, выраженной в виде URL, одинаково в обоих файлах: file: //abc.xsd

exampleDocument2 определяет с помощью xsi: schemaLocation местоположение XML-схемы abc как http://data.newsit.biz/fortesting/abc.xsd

В этом контексте местоположения (URL) схемы abc различны, и XMLspy интерпретирует это как разные схемы и выдает ошибки, связанные с определением, например, rootElement в двух разных схемах.

Действие нашей группы: чтобы иметь возможность использовать веб-расположение схемы abc http://data.newsit.biz/fortesting/abc.xsd в XML-документе, мы должны были использовать этот URL-адрес также в файле testing.xsd.Затем документ exampleDocument2 был подтвержден как правильный.

0 голосов
/ 17 сентября 2018

Я получаю ту же ошибку '{element} уже объявлен' в моей среде (XMLSpy 2017 sp2 x64 / Win 7 Ent v6.1 build 7601 sp1).

Однако мой простой скрипт проверки Python с использованием lxml / etree корректно проверяет как локальную, так и удаленную схемы.

...