xmllint を使用していくつかの検証を行っており、2つのスキーマに対して検証する必要があるXMLインスタンスドキュメントがあります。1つは外側の「エンベロープ」(を含む)用です。 any要素)および特定のペイロード用に1つ。 A.xsdはエンベロープスキーマ、B.xsdはペイロードと言いますスキーマ(可能なペイロードはさまざまです)およびab.xml有効なXMLインスタンスドキュメント(投稿の最後に例を示します)。
3つのファイルすべてが同じディレクトリでローカルに利用可能であり、検証を実行するために xmllint を使用しており、schema引数として外部(エンベロープ)スキーマ:
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を取得して、インスタンスドキュメントを検証するときに両方のスキーマを考慮するにはどうすればよいですか?代わりに使用できる別のコマンドラインユーティリティまたはグラフィカルツールはありますか?
<?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>
<?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>
<?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を使用しました。
Xerces tarballをダウンロードし、ローカルフォルダーに展開した後、 この提案 (から)に基づいて次のvalidateスクリプトを作成しましたWebアーカイブ-元のリンクは現在無効になっています):
#!/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要素からスキーマの場所を読み取っているため、コマンドライン呼び出しでスキーマの場所を指定する必要はありません。
ラッパースキーマを作成し、両方の名前空間をインポートできます。 AB.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
A.xsd
にimport
要素がある場合、schema
タグを開いた直後に
<xsd:import namespace="http://www.example.org/B" schemaLocation="B.xsd"/>
次に、A.xsd
をxmllint
に渡すと、次のように機能します。
xmllint -schema A.xsd ab.xml