当还指定 XSD 时 DTD 被忽略?

DTD ignored when XSD is also specified?

当为 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 location 回到 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">

任何人都可以确认什么是正确的行为吗?

我认为 Michael 的上述评论提供了很好的见解。

至 round-up,XMLSpy 已回复我并确认在 XMLSpy2018sp1 中,任何指定的 XSD 将 "win" 通过 DTD关于元素和属性内容。除了暂时从 XML.

中删除 XSD 规范外,目前没有其他解决方法

他们已经把它放在了他们的愿望清单上,以便能够控制验证的类型和顺序 - 但不要屏住呼吸,因为我承认这有点边缘情况。我原以为这是一个很容易添加的功能!