web-dev-qa-db-ja.com

xmllint:ローカルDTDファイルを使用してXMLを検証する方法

ローカルDTDファイルtest.dtdがあります。内容は:

<!DOCTYPE coord [
<!ELEMENT coord (date)>
<!ELEMENT date (#PCDATA)>
]>

Xmllintを使用してXMLを検証したいと思います。このXMLにはDOCTYPEが含まれていません:

<?xml version="1.0" encoding="x-mac-roman"?>
<coord>
    <date>20150312</date>
</coord>

DTDブロックを2行目としてXMLファイルのコピーに挿入し、次を使用しても問題ありません。

xmllint --valid --noout my2.xml

しかし、私が試してみると:

xmllint --loaddtd test.dtd --valid --noout my.xml

xmllint --dtdvalid test.dtd --noout my.xml

どちらも機能しません。アウトアウトは:

test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
Could not parse DTD test.dtd

何か案が ?私のXML[〜#〜] must [〜#〜]には、外部DOCTYPEファイルを参照するためのDOCTYPE行(SYSTEMキーワード付き)が含まれているようです。避けたいこと。参照: http://www.w3schools.com/dtd/

XMLを変更せずに解決策はありますか?

15
Eric H.

まず、外部DTDは<!DOCTYPEプリアンブルを必要としません-DTDファイルから削除します。

<!ELEMENT coord (date)>
<!ELEMENT date (#PCDATA)>

次に、--loaddtdfetchs外部DTDを取得します。これは、validating外部DTDに対して。次のように--dtdvalidオプションを使用します。

$ xmllint --noout --dtdvalid test.dtd test.xml

XMLドキュメントが有効な場合、xmllintは何も出力しません(--nooutのため)。 DTDをに変更する場合は、次のように言います。

<!ELEMENT coord (date,other)>
<!ELEMENT date (#PCDATA)>

出力は次のようになります

$ xmllint --noout --dtdvalid test.dtd test.xml
test.xml:2: element coord: validity error : Element coord content does not follow the DTD, expecting (date , other), got (date )
Document test.xml does not validate against test.dtd

[〜#〜] nmt [〜#〜] または XMLSoft のドキュメントページで詳細を探してください。

22
Mathias Müller