在指定XSD时忽略DTD?

时间:2018-03-13 20:34:50

标签: xml dtd xsd-validation xerces xmlspy

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

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

1 个答案:

答案 0 :(得分:1)

我认为迈克尔上面的评论提供了很好的见解。

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

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

相关问题