1

在为 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">

任何人都可以确认什么是正确的行为,如果有的话?

4

1 回答 1

1

我认为迈克尔上面的评论提供了很好的洞察力。

总结一下,XMLSpy 已经回复我并确认在 XMLSpy2018sp1 中,任何指定的 XSD 都将在元素和属性内容方面“胜过”DTD。除了暂时从 XML 中删除 XSD 规范之外,目前没有其他解决方法。

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

于 2018-03-19T09:34:57.570 回答