xmllint:如何使用本地 DTD 文件验证 XML

Posted

技术标签:

【中文标题】xmllint:如何使用本地 DTD 文件验证 XML【英文标题】:xmllint : how to validate an XML using a local DTD file 【发布时间】:2015-05-18 08:08:34 【问题描述】:

我有一个本地 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 块作为第二行插入到我的 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 行(带有 SYSTEM 关键字)来引用我想避免的外部 DOCTYPE 文件。见:http://www.w3schools.com/dtd/

有没有不修改xml的解决方案?

【问题讨论】:

该命令的输出是什么? DTD 似乎有问题。不是吗? 否,因为当我将这个 DTD 文本按原样插入 XML 时,它可以工作。也许我需要在 DTD 文本文件中添加一个介绍行? 你能显示你的 dtd 和 xml 吗? 好的,我已经修改了我的问题以包含它们。 【参考方案1】:

首先,外部 DTD 不需要 &lt;!DOCTYPE 前导码 - 从 DTD 文件中删除它:

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

然后,--loaddtd获取一个外部 DTD,这与针对外部 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 的文档页面上查找更多信息。

【讨论】:

谢谢。但没有什么说“坐标”是根元素。 @EricH。如果您考虑一下,您不需要知道哪个元素是根。重要的是您,DTD 的作者,知道哪个元素是根元素,并为它编写规则。 xmllint 从根开始解析 XML 文档,因此无论如何都会首先应用此规则。 为我工作。 xmllint --noout --dtdvalid test.dtd test.xml

以上是关于xmllint:如何使用本地 DTD 文件验证 XML的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何将本地DTD文件的验证应用于java中的xml文件?

使用 Java 针对本地 DTD 文件验证 XML 文件

如何在 Sublime Text 3 中使用 xmllint?

如何将环境变量传递给传递给xmllint的命令?

为啥 xmllint 将其返回为无效

如何使用xmllint / xpath解析不同元素上的几个属性的值?