在为 XML 文档同时指定 DTD 和 XSD 时,验证器似乎会针对 XSD 进行验证并完全忽略 DTD。
我已经在 XMLSpy 2018sp1 和 Xerces 的 StdInParse 工具中验证了这一点。
标准用例是我们引用(并且从不编辑)的行业标准 DTD,我必须对其进行验证。除此之外,我们使用我们自己的 XSD 进一步约束 XML。
我的直觉是,如果两者都指定了,DTD 和 XSD 都应该通过验证才能验证文档吗?但也许 XSD 被认为可以取代任何 DTD?
示例 XML - 在下面 - foo.dtd 将永远不会用于验证文档。即使它违反 foo.dtd,它也会将文档视为有效,前提是它针对 foo.xsd 进行验证。
如果您从<Foo>
foo.dtd 中删除属性并再次验证,例如 XMLSpy 将突然发现任何 DTD 问题....将 XSD 位置放回 Foo,错误再次消失!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Foo
SYSTEM "/usr/local/share/xml/schema/foo/foo.dtd">
<Foo xmlns="https://www.foo.com/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.foo.com/schema /usr/local/share/xml/schema/foo/foo.xsd">
任何人都可以确认什么是正确的行为,如果有的话?