使用 XSD 时 xmllint 验证错误“未找到 DTD”

Posted

技术标签:

【中文标题】使用 XSD 时 xmllint 验证错误“未找到 DTD”【英文标题】:xmllint validation error "no DTD found" while using XSD 【发布时间】:2016-07-18 23:04:11 【问题描述】:

我正在尝试使用 xmllint 来检查我的工作,同时开发一个基本的 XSD,即 XML Schema 模式。但是它给了我一个错误

验证失败:未找到 DTD。

我做错了什么?

我的 xmllint 命令:

xmllint --noout --valid --schema simple.xsd lucas-basic.xml
lucas-basic.xml:5: validity error : Validation failed: no DTD found !
        >
        ^
lucas-basic.xml validates

测试 XSD 文件:

<?xml version = "1.0" encoding = "UTF-8"?>
<!--Generated by XML Authority. Conforms to w3c http://www.w3.org/2001/XMLSchema-->
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
        <xsd:element name = "vehicles">
                <xsd:complexType>
                        <xsd:sequence>
                                <xsd:element name = "nickname" type = "xsd:string" maxOccurs = "unbounded"/>
                        </xsd:sequence>
                </xsd:complexType>
        </xsd:element>
</xsd:schema>

测试 XML 文件:

<?xml version="1.0"?>
<vehicles
                xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation = "http://lucas.ucs.ed.ac.uk/xml-schema/xmlns/simple.xsd"
        >
        <nickname>Bog Hopper</nickname>
        <nickname>Wee Beastie</nickname>
        <nickname>Count Zero</nickname>
</vehicles>

xsi:noNamespaceSchemaLocation 处的 URL 确实返回了上述 XSD。另外,我下载了xsd文件并将其放入当前目录作为额外的措施,但这似乎没有改变任何东西。

【问题讨论】:

现在我已经让它工作了,我应该评论说使用本地文件或指定远程模式同样有效,例如--schema simple.xsd 或 --schema lucas.ucs.ed.ac.uk/xml-schema/xmlns/simple.xsd 【参考方案1】:

--valid 用于 DTD,而不是 XSD。

这对你有用:

xmllint --noout --schema http://lucas.ucs.ed.ac.uk/xml-schema/xmlns/simple.xsd lucas-basic.xml

【讨论】:

这似乎有效,谢谢!这是否意味着使用 XSD 而不是 DTD 编写的文档在技术上不是有效的 XML? 哈哈,不,这意味着他们选择的命令行开关名称不完善。【参考方案2】:

OP 尝试和接受的答案通过针对示例文件进行测试来“验证”XSD。要根据 XSD 规范验证 XSD 文件,可以使用以下命令:

xmllint --noout --schema http://www.w3.org/2001/XMLSchema.xsd my_schema.xsd

...对于 v1.1,架构是 https://www.w3.org/2009/XMLSchema/XMLSchema.xsd

注意:v1.0 架构在顶部有一些关于规范结构架构的限定,因此实际上可能应该使用另一个文件,但这对我来说很好。

【讨论】:

以上是关于使用 XSD 时 xmllint 验证错误“未找到 DTD”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 xmllint 将其返回为无效

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

PHP - 带有 unicode 正则表达式的 XSD 模式验证错误

xsd 使用参数验证 url [重复]

验证文件 spring-ldap.xsd 时出错

XSD 属性 NILLABLE 不起作用