我有一个本地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的解决方案?
答案 0 :(得分:19)
首先,外部DTD不需要<!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