有没有办法在没有 DOCTYPE DTD 声明的情况下将 XHTML 实体引用嵌入到 XML 文本中? DOCTYPE 行在它所针对的 java 服务器上引起了问题。
转义 &;序列是不可接受的,嵌入 CDATA 中也是如此。需要验证参考文献。
可以从模式定义而不是 XML 数据文件中引用 DTD。
更广泛地说,在 XML 中嵌入 XHTML(或至少实体引用)并对其进行验证的常见做法是什么?
一个潜在的解决方案是将整个 XHTML 1.0 DTD 转换为模式,但这听起来不是最好的主意。
您是否尝试过没有 PUBLIC 或 SYSTEM 标识符的 DOCTYPE?
您可以将 ENTITY 声明直接添加到内部子集:
<!DOCTYPE foo [
<!ENTITY nbsp " ">
<!ENTITY copy "©">
<!ENTITY laquo "«">
<!ENTITY reg "®">
<!ENTITY deg "°">
<!ENTITY plusmn "±">
<!ENTITY sup2 "²">
<!ENTITY sup3 "³">
<!ENTITY frac14 "¼">
<!ENTITY frac12 "½">
<!ENTITY frac34 "¾">
]>
<foo/>
或者您可以使用参数实体指向具有您的 ENTITY 声明的外部文件:
<!DOCTYPE foo [
<!ENTITY % ents SYSTEM "xhtml-lat1.ent">
%ents;
]>
<foo/>
如果您有 5 个预定义实体引用以外的实体引用,并且没有文档类型,则 XML 格式不正确。
如果你使用数字字符引用而不是命名实体引用,你会大大简化事情,所以使用
 
代替
如果你控制的话,要么通过修改原始生成,要么通过使用任何 xml 解析器或使用 perl 或等效的简单文本替换来扩展实体。您可以在此处获取以 dtd 或 json 或其他格式设置的 html(5) 实体的完整列表http://www.w3.org/2003/entities/2007/
EntityResolver2.getExternalSubset()
:
允许应用程序为未明确定义的文档提供外部子集。因此,带有省略外部子集的 DOCTYPE 声明的文档可以增加可用于验证、实体处理和属性处理(规范化、默认和报告类型,包括 ID)的声明。
此方法也可用于没有 DOCTYPE 声明的文档。当遇到根元素,但没有看到 DOCTYPE 声明时,调用此方法。
不幸的是,后者(在不存在 DOCTYPE 时调用
getExternalSubset()
)不会发生在 JDK JAXP 实现中,例如,将真正的 Xerces 插入运行时。尽管如此,我已经在实践中成功地使用了它——见flyingsaucer@19b962fb0a72
。
更新:
不幸的是,后者(在不存在 DOCTYPE 时调用
)在 JDK JAXP 实现中没有发生...getExternalSubset()
我发现:
然后我报告:
概述
getExternalSubset()
在 JDK 提供的实现中没有按预期工作的另一种情况。同样,使用原始 Xerces2 实现,所有这些似乎都按预期工作。