好的。我想为 xmllint 设置目录文件来修复问题,以便从本地文档验证 dcterms xml 命名空间。我相信我所做的一切都是正确的,但它似乎根本不起作用。
我正在运行 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
我创建了一个名为“catalog”的文件
$ 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>
注意流程内容是“严格的”。
我创建了一个 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 找不到它?
程序
xmllint
不会根据要解析的XML文件中找到的xmlns="something"
属性自动加载XSD文件,它仅使用--schema
参数中指定的XSD(以及导入/包含的XSD)从此)。
对于测试,您可以创建一个像这样的
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月2日编辑。 ---
我建议在
<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
文件的位置] 可能更容易处理。
title
中没有dcterms
元素,所以我用abstract
<import namespace="http://purl.org/dc/terms/" schemaLocation="dcterms.xsd" />
插入 Empty.xsd
。之后我就删除了No matching global
消息。No DTD found
仍然可见,但返回码从 3 增加到 4,这意味着解析成功。--sax
开关似乎有助于“未找到 DTD”消息。相关问题:使用架构标题和目录查找进行 Xml 验证,没有答案。这就是第 2 点。