web-dev-qa-db-ja.com

xmllint:2つのXSDスキーマ(エンベロープ/ペイロード)に対してXMLファイルを検証します

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

したがって、xmllintxsi: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>
19

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.xmlxsi:schemaLocation要素からスキーマの場所を読み取っているため、コマンドライン呼び出しでスキーマの場所を指定する必要はありません。

12

ラッパースキーマを作成し、両方の名前空間をインポートできます。 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
9
MarkBarry

A.xsdimport要素がある場合、schemaタグを開いた直後に

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

次に、A.xsdxmllintに渡すと、次のように機能します。

xmllint -schema A.xsd ab.xml
5
fiatjaf