我有一个带有以下验证方案的API:
<root>
<header>
</header>
<body>
<element></element>
</body>
&#39;元件&#39;有规则(在xsd架构中):带限制基:xs:string
是否可以在不更改规则的情况下使用DTD实体?像这样:
<!ENTITY foo "something cool">
<element>&foo;</element>
到目前为止,当我使用实体时,方案验证失败了。当我不(使用字符串)时它可以正常工作。
有什么想法吗?
编辑:<!ENTITY foo "something cool">
部分工作正常(我已经使用外部实体对其进行了测试)。我无法使用结果。
答案 0 :(得分:2)
XSD规范中没有任何内容禁止在DTD符号中使用DTD和实体声明,以便XSD验证器验证文档。 (它不能:XSD在任何格式良好的XML信息集上运行,在实体扩展之后,因此XSD无法确定是否存在DTD处理。)所以原则上答案是“是的,它是可能的”。
DTD和XSD架构的共存确实会使某些软件和某些人混淆,但是,默认情况下可能会有处理器假定如果输入中有文档类型声明,那么一定不要XSD验证。 (我没有遇到任何问题,但这并不意味着它们不存在。)您可以覆盖该默认假设。
答案 1 :(得分:1)
以@CMSperbergMcQueen为例补充答案。
我用这个XML测试了你的例子:
<!DOCTYPE root [
<!ENTITY foo "something cool">
]>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="dtdschema.xsd">
<body>
<element>A plain string</element>
<element>&foo;</element>
</body>
</root>
和像这样的XSD元素声明:
<xs:element name="element">
<xs:simpleType>
<xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
</xs:element>
在 Xerces 和 Saxon EE 中成功验证。您还可以在 this online service 中看到它进行验证,您可以在其中对其进行修改并查看结果。
答案 2 :(得分:0)
我终于发现问题不是无效的XML,但PHP LibXML验证器(DOMDocument :: schemaValidate)失败了。 验证helderdarocha的XML示例(有效)会导致架构验证错误:
内部错误:xmlSchemaVDocWalk,当前正在验证的节点树中至少有一个实体引用。尚不支持使用此XML Schema处理器处理实体。请在验证前替换实体。
所以在这种情况下,我的XML是正确的(始终),但验证器无法验证它。
希望这会让一些人头疼:)