5

Ok。ローカル ドキュメントから dcterms xml 名前空間が検証されるように、問題を修正するために xmllint のカタログ ファイルをセットアップしたいと考えています。私はすべてを正しく行ったと信じていますが、うまく機能していないようです。

私はOSXを実行しています。

ディレクトリ /etc/xml を作成しました

$ mkdir /etc/xml
$ cd /etc/xml

そのディレクトリに dcterms.xsd をダウンロードしました

$ ls -l
-rw-r--r--  1 ibis  wheel  12507 24 Jul 11:42 dcterms.xsd

「カタログ」という名前のファイルを作成しました

$ xmlcatalog --create > catalog

dcterms 名前空間をカタログ ファイルに追加しました

$ xmlcatalog --noout --add uri http://purl.org/dc/elements/1.1/ file:///etc/xml/dc.xsd
$ xmlcatalog --noout --add uri http://purl.org/dc/terms/ file:///etc/xml/dcterms.xsd
$ cat catalog
<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <uri name="http://purl.org/dc/elements/1.1/" uri="file:///etc/xml/dc.xsd"/>
  <uri name="http://purl.org/dc/terms/" uri="file:///etc/xml/dcterms.xsd"/>
</catalog>

作業ディレクトリに、Empty.xsd という名前の単純な xml スキーマを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Empty" xmlns:tns="http://www.example.org/Empty" elementFormDefault="qualified">
  <element name="empty">
    <complexType>
      <sequence>
        <any processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
      </sequence>
      <anyAttribute></anyAttribute>
    </complexType>
  </element>
</schema>

processcontnts は「厳密」であることに注意してください。

すべての検証トリガーする XML ファイルを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<empty xmlns="http://www.example.org/Empty" 
          xmlns:dcterms="http://purl.org/dc/terms/">
    <dcterms:title>A title</dcterms:title>
</empty>

次に、それを検証しようとします。

$ xmllint --noout --valid --schema Empty.xsd Empty.xml
Empty.xml:2: validity error : Validation failed: no DTD found !
y xmlns="http://www.example.org/Empty" xmlns:dcterms="http://purl.org/dc/terms/"
                                                                               ^
Empty.xml:3: element title: Schemas validity error : Element '{http://purl.org/dc/terms/}title': No matching global element declaration available, but demanded by the strict wildcard.
Empty.xml fails to validate

ドキュメントで指定されているようにカタログをセットアップし、ローカルの dcterms スキーマ ファイルを指定しました。xmllint がそれを見つけられないのはなぜですか?

4

2 に答える 2

2
  1. titleに要素がないdctermsので、に置き換えましたabstract
  2. 確認は見つかりませんが、libxmlでxsdスキーマのカタログファイルを使用する際の問題を報告する人もいます。ただし、カタログはdtdsで問題なく機能していることがわかりました。
  3. 回避策があります。に挿入<import namespace="http://purl.org/dc/terms/" schemaLocation="dcterms.xsd" />Empty.xsdます。その後、私はNo matching globalメッセージを取り除きました。
  4. No DTD foundは引き続き表示されますが、戻りコードが3から4に増加しました。これは、解析が成功したことを意味します。
  5. 編集:--saxスイッチは「DTDが見つかりません」というメッセージに役立つようです。

関連する質問:スキーマヘッダーとカタログルックアップを使用したXML検証、回答なし。それがポイント2についてです。

于 2012-09-05T16:57:17.597 に答える
2

プログラムは、解析対象の XML ファイルで見つかった属性にxmllint基づいて XSD ファイルを自動ロードしません。パラメーターで指定された XSD (およびそこからインポート/インクルードされたもの) のみを使用します。xmlns="something"--schema

NonEmpty.xsdテストでは、次のように作成できます。

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/Empty"
    elementFormDefault="qualified">
  <include schemaLocation="Empty.xsd"/>
  <import schemaLocation="dcterms.xsd" namespace="http://purl.org/dc/terms/"/>
</schema>

使用法:

$ xmllint -debugent -noout -schema NonEmpty.xsd Empty.xml
new input from file: NonEmpty.xsd
new input from file: Empty.xsd
new input from file: dcterms.xsd
new input from file: http://www.w3.org/2001/03/xml.xsd
new input from file: dc.xsd
new input from file: dcmitype.xsd
new input from file: Empty.xml
Empty.xml validates

catalogファイルで:

<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <uri name="http://www.w3.org/2001/03/xml.xsd"          uri="file:///home/zsiga/proba/dcterms/2001_03_xml.xsd"/>
  <uri name="http://dublincore.org/schemas/xmls/qdc/dcterms.xsd" uri="file:///home/zsiga/proba/dcterms/dcterms.xsd"/>
</catalog>

NonEmpty2.xsdファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/Empty"
    elementFormDefault="qualified">
  <include schemaLocation="Empty.xsd"/>
  <import schemaLocation="http://dublincore.org/schemas/xmls/qdc/dcterms.xsd" namespace="http://purl.org/dc/terms/"/>
</schema>

そしてその使用法:

$ XML_CATALOG_FILES=./catalog xmllint -debugent -noout \
    -schema NonEmpty2.xsd Empty.xml
new input from file: NonEmpty2.xsd
new input from file: Empty.xsd
new input from file: file:///home/zsiga/proba/dcterms/dcterms.xsd
new input from file: file:///home/zsiga/proba/dcterms/2001_03_xml.xsd
new input from file: file:///home/zsiga/proba/dcterms/dc.xsd
new input from file: file:///home/zsiga/proba/dcterms/dcmitype.xsd
new input from file: Empty.xml
Empty.xml validates

--- 2020.11.02を編集。---

<systemId>でタグを使用しcatalog、相対パス名も使用することをお勧めします。

<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <system systemId="http://www.w3.org/2001/03/xml.xsd"                  uri="2001_03_xml.xsd"/>
  <system systemId="http://dublincore.org/schemas/xmls/qdc/dcterms.xsd" uri="dcterms.xsd"/>
</catalog>

結果は同じですが、一部のプログラムは よりも優先<system>され<uri>ます。また、[ファイルの場所に相対的な] 相対パス名のcatalog方が扱いやすいかもしれません。

于 2018-10-11T13:28:12.180 に答える