xmllint: проверка XML-файла на двух схемах XSD (конверт / полезная нагрузка)

я использую xmllint чтобы сделать некоторые проверки, и у меня есть документ экземпляра XML, который необходимо проверить по двум схемам: одна для внешнего "конверта" (который включает любой element) и один для конкретной полезной нагрузки. Скажи A. xsd схема конверта, B. xsd схемы нагрузки (возможны различные нагрузки) и ab.в XML допустимый документ экземпляра XML (я предоставляю пример в конце пост.)

у меня есть все три файла локально доступны в одном каталоге и я использую xmllint для выполнения проверки, предоставляя как - схемы аргумент расположение внешней (огибающей) схемы:

xmllint -schema A.xsd ab.xml

... тем не менее, хотя я предоставляю местоположение как A. xsd, так и B. xsd в документе экземпляра (используя xsi: schemaLocation элемент) xmllint не удается найти его и жалуется:

ab.xml:8: element person: Schemas validity error : Element '{http://www.example.org/B}person': No matching global element declaration available, but demanded by the strict wildcard.
ab.xml fails to validate

видимо xmllint не читал xsi: schemaLocation элемент. Я понимаю это xmllint может быть настроен с каталогами, но я не смог получить xmllint чтобы найти обе схемы. Как я должен получить xmllint чтобы учесть обе схемы при проверке документа экземпляра или есть другая утилита командной строки или графический инструмент, который я мог бы использовать вместо?

SSCCE

A. xsd - схема конверта

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified" 
        xmlns               ="http://www.w3.org/2001/XMLSchema"
        xmlns:a             ="http://www.example.org/A"
        targetNamespace ="http://www.example.org/A">

       <element name="someType" type="a:SomeType"></element>

        <complexType name="SomeType">
            <sequence>
                <any namespace="##other" processContents="strict"/>
            </sequence>
        </complexType>
</schema>

B. xsd-схема полезной нагрузки

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
    xmlns          ="http://www.w3.org/2001/XMLSchema"
    xmlns:b        ="http://www.example.org/B"
    targetNamespace="http://www.example.org/B"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <element name="person" type="b:PersonType"></element>
    <complexType name="PersonType">
        <sequence>
                <element name="firstName" type="string"/>
                <element name="lastName"  type="string"/>
        </sequence>
    </complexType>
  </schema>

ab.xml-экземпляр документа

<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A"
        xmlns:b="http://www.example.org/B"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.org/A A.xsd
                            http://www.example.org/B B.xsd">

            <b:person>
                <b:firstName>Mary</b:firstName>
                <b:lastName>Bones</b:lastName>
            </b:person>

</a:someType>

3 ответов


я бросила на xmllint и использовать Xerces.

Я скачал Xerces tarball и после взрыва его в какой-то локальной папке я создал следующее проверка сценарий (на основе предложение):

#!/bin/bash
XERCES_HOME=~/software-downloads/xerces-2_11_0/
echo $XERCES_HOME
java -classpath $XERCES_HOME/xercesImpl.jar:$XERCES_HOME/xml-apis.jar:$XERCES_HOME/xercesSamples.jar sax.Counter $*

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

 validate -v -n -np -s -f ab.xml

Xerces считывает местоположения схемы из xsi: schemaLocation элемент ab.в XML поэтому их не нужно указывать в вызове командной строки.


если бы у вас был import элемент A.xsd, сразу после открытия тега schema tag,

<xsd:import namespace="http://www.example.org/B" schemaLocation="B.xsd"/>

тогда вы могли бы пройти A.xsd to xmllint и это будет работать с:

xmllint -schema A.xsd ab.xml

можно создать схему оболочки и импортировать оба пространства имен. АВ.имя xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema">
    <import namespace="http://www.example.org/A" schemaLocation="A.xsd"/>
    <import namespace="http://www.example.org/B" schemaLocation="B.xsd"/>
</schema>

затем:

xmllint --schema AB.xsd ab.xml
<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A" xmlns:b="http://www.example.org/B" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/A A.xsd                             http://www.example.org/B B.xsd">

            <b:person>
                <b:firstName>Mary</b:firstName>
                <b:lastName>Bones</b:lastName>
            </b:person>

</a:someType>
ab.xml validates