xmllint:如何使用本地 DTD 文件验证 XML
xmllint : how to validate an XML using a local DTD file
我有一个本地 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 不需要 <!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
我有一个本地 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 不需要 <!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