Xml 同时指定XSD时是否忽略DTD?

Xml 同时指定XSD时是否忽略DTD?,xml,dtd,xsd-validation,xerces,xmlspy,Xml,Dtd,Xsd Validation,Xerces,Xmlspy,当为XML文档同时指定DTD和XSD时,验证器似乎根据XSD进行验证,并完全忽略DTD 我已经在XMLSpy 2018sp1和Xerces的StdInParse工具中验证了这一点 这方面的标准用例是,我们引用(并且从不编辑)一个行业标准DTD,me必须根据该DTD进行验证。此外,我们还使用自己的XSD进一步约束XML 我的直觉是,如果两者都指定了,那么DTD和XSD都必须通过验证才能验证文档?但也许XSD被认为可以取代任何DTD 示例XML-在下面的-foo.dtd中将永远不会用于验证文档。即使

当为XML文档同时指定DTD和XSD时,验证器似乎根据XSD进行验证,并完全忽略DTD

我已经在XMLSpy 2018sp1和Xerces的StdInParse工具中验证了这一点

这方面的标准用例是,我们引用(并且从不编辑)一个行业标准DTD,me必须根据该DTD进行验证。此外,我们还使用自己的XSD进一步约束XML

我的直觉是,如果两者都指定了,那么DTD和XSD都必须通过验证才能验证文档?但也许XSD被认为可以取代任何DTD

示例XML-在下面的-foo.dtd中将永远不会用于验证文档。即使文档违反了foo.dtd,只要它根据foo.xsd进行验证,它也会将文档作为有效文档传递

如果从
中删除属性并再次针对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">


有人能证实什么是正确的行为吗,如果有的话?

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

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


他们已经把它放在他们的愿望清单上,以便能够控制验证的类型和顺序——但不要屏住呼吸,因为我承认这有点像边缘案例。我原以为添加tho是一个简单的功能

没有“正确”的行为。要求解析器执行DTD或模式验证的机制完全依赖于解析器。我总是觉得Altova在有schemaLocation属性的情况下进行模式验证的实践并不是特别有用。如果您想同时进行DTD和模式验证,那么实现这一点的一种方法是让解析器进行DTD验证,然后通过一个独立的模式验证器(如Saxon)进行过滤,该验证器独立于parser.Related(但更多的是关于目的而不是方法):。@kjhughes-是的,你给出的理由基本上就是为什么我要把它们混在一起。令人放心的是,我不是唯一一个想出这个有效用例的人。