是否可以使用方案xs:string的DTD实体

时间:2014-05-30 08:49:29

标签: xml xsd dtd

我有一个带有以下验证方案的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">部分工作正常(我已经使用外部实体对其进行了测试)。我无法使用结果。

3 个答案:

答案 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是正确的(始终),但验证器无法验证它。

希望这会让一些人头疼:)