5

Ok. I want to set up catalog files for xmllint to fix things so that the dcterms xml namespace is validated from a local document. I believe that I have done everything right, but it simply doesn't seem to be working.

I am running OSX.

I have created a directory /etc/xml

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

I have downloaded dcterms.xsd to that directory

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

I have created a file named "catalog"

$ xmlcatalog --create > catalog

I have added the dcterms namespace to the catalog file

$ 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>

In a work directory, I have created a simple xml schema named Empty.xsd

<?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>

Note that the processcontnts is "strict".

I have created an XML file which should trigger all the validation:

<?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>

Then I attempt to validate it.

$ 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

I have set up a catalog as specified in the docs and pointed it at the local dcterms schema file. Why does xmllint fail to find it?

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

程序xmllint不会根据xmlns="something"要解析的 XML 文件中的属性自动加载 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.02。---

我想建议使用<systemId>标签 in 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 回答