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