如何在没有 DOCTYPE、CDATA 或转义的情况下将 XHTML 嵌入 XML?

问题描述 投票:0回答:3

有没有办法在没有 DOCTYPE DTD 声明的情况下将 XHTML 实体引用嵌入到 XML 文本中? DOCTYPE 行在它所针对的 java 服务器上引起了问题。

转义 &;序列是不可接受的,嵌入 CDATA 中也是如此。需要验证参考文献。

可以从模式定义而不是 XML 数据文件中引用 DTD。

更广泛地说,在 XML 中嵌入 XHTML(或至少实体引用)并对其进行验证的常见做法是什么?

一个潜在的解决方案是将整个 XHTML 1.0 DTD 转换为模式,但这听起来不是最好的主意。

xml xhtml schema doctype dtd
3个回答
3
投票

您是否尝试过没有 PUBLIC 或 SYSTEM 标识符的 DOCTYPE?

您可以将 ENTITY 声明直接添加到内部子集:

<!DOCTYPE foo [
<!ENTITY nbsp   "&#160;">
<!ENTITY copy   "&#169;">
<!ENTITY laquo  "&#171;">
<!ENTITY reg    "&#174;">
<!ENTITY deg    "&#176;">
<!ENTITY plusmn "&#177;">
<!ENTITY sup2   "&#178;">
<!ENTITY sup3   "&#179;">
<!ENTITY frac14 "&#188;">
<!ENTITY frac12 "&#189;">
<!ENTITY frac34 "&#190;">
]>
<foo/>

或者您可以使用参数实体指向具有您的 ENTITY 声明的外部文件:

<!DOCTYPE foo [
<!ENTITY % ents SYSTEM "xhtml-lat1.ent">
%ents;
]>
<foo/>

2
投票

如果您有 5 个预定义实体引用以外的实体引用,并且没有文档类型,则 XML 格式不正确。

如果你使用数字字符引用而不是命名实体引用,你会大大简化事情,所以使用

&#160;
代替
&nbsp;

如果你控制的话,要么通过修改原始生成,要么通过使用任何 xml 解析器或使用 perl 或等效的简单文本替换来扩展实体。您可以在此处获取以 dtd 或 json 或其他格式设置的 html(5) 实体的完整列表http://www.w3.org/2003/entities/2007/


0
投票

一个人也许可以使用 SAX

EntityResolver2.getExternalSubset()

允许应用程序为未明确定义的文档提供外部子集。因此,带有省略外部子集的 DOCTYPE 声明的文档可以增加可用于验证、实体处理和属性处理(规范化、默认和报告类型,包括 ID)的声明。

此方法也可用于没有 DOCTYPE 声明的文档。当遇到根元素,但没有看到 DOCTYPE 声明时,调用此方法。

不幸的是,后者(在不存在 DOCTYPE 时调用

getExternalSubset()
)不会发生在 JDK JAXP 实现中,例如,将真正的 Xerces 插入运行时。尽管如此,我已经在实践中成功地使用了它——见flyingsaucer@
19b962fb0a72


更新:

不幸的是,后者(在不存在 DOCTYPE 时调用

getExternalSubset()
)在 JDK JAXP 实现中没有发生...

我发现:

  • JDK-6524460:Java6 中不再使用 EntityResolver2(创建时间:2007-02-13)

然后我报告:

  • JDK-8305253:损坏的 org.xml.sax.ext.EntityResolver2.getExternalSubset() 行为

概述

getExternalSubset()
在 JDK 提供的实现中没有按预期工作的另一种情况。同样,使用原始 Xerces2 实现,所有这些似乎都按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.