我正在使用
xmllint进行一些验证,并且我有一个XML实例文档需要针对两个模式进行验证:一个用于外部“信封”(包括任何元素),另一个用于特定的有效载荷.说A.xsd是包络模式,B.xsd是有效载荷模式(有不同的可能的有效载荷)和ab.xml一个有效的XML实例文档(我在后面提供了一个例子).
我拥有同一目录中本地可用的所有三个文件,并使用xmllint执行验证,作为架构参数提供外(信封)架构的位置:
xmllint -schema A.xsd ab.xml
…但是,尽管我在实例文档(使用xsi:schemaLocation元素)中提供了A.xsd和B.xsd两者的位置,但是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>
我退出xmllint并使用Xerces.
原文链接:https://www.f2er.com/xml/292808.html我下载了Xerces的tarball,并将其爆炸到一些本地文件夹后,我创建了以下验证脚本(基于this suggestion):
#!/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正在读取ab.xml中的xsi:schemaLocation元素中的模式位置,因此不需要在命令行调用中提供它们.