如何在有效的 XML 文档中定义 HTML 实体引用?

Posted

技术标签:

【中文标题】如何在有效的 XML 文档中定义 HTML 实体引用?【英文标题】:How do I define HTML entity references inside a valid XML document? 【发布时间】:2011-09-24 10:19:54 【问题描述】:

我需要能够引用命名的 html 实体,例如 •,而不是 XML 文档中的 Unicode 替代 •。我可以控制 XML 文档的某些部分,例如定义 DOCTYPE,但是在实际 XML 中进行查找和替换不是一种选择。我可以通过包含 XHTML 过渡 DOCTYPE 获得一些元素,如  &,但我需要手动定义更多。我该怎么做?

-- 编辑--

感谢 Jim 的回答,这就是我最终得到的结果。这很棒,因为我可以利用 XHTML 过渡实体,还可以添加我自己的:

<!DOCTYPE
   html
   PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
   [
      <!ENTITY bull  "&#8226;">
      <!ENTITY ldquo "&#8220;">
      <!ENTITY rdquo "&#8221;">
      ... etc ...
   ]
>

【问题讨论】:

如果您最终使用了大量的实体声明,请考虑将它们放在单独的文件中,然后使用参数实体来引用它们。 【参考方案1】:

如果您可以修改 XML 以包含内联 DTD,您可以在那里定义实体:

<!DOCTYPE yourRootElement [
    <!ENTITY bull "&#8226;">
    ....
]>

【讨论】:

这太神奇了!它也可以用来构建android清单文件,可以很容易地创建一个模板,而不会在包名等上出错......【参考方案2】:

我不知道,但我认为 XHTML DTD 应该为您提供很多实体 (253):

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML

同样在 w3 规范中,提到了用于特殊字符等的附加 DTD。 http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_dtd_xhtml_character_entities

但是我一直找不到特殊字符 DTD 的实现示例。


由 DevNull 编辑

这是实体 DTD 模块之一的非常通用的示例实现。要实现,只需要添加一个指向模块的参数实体即可。

<?xml version="1.0"?>
<!DOCTYPE test [
<!ELEMENT test (#PCDATA)>
<!ENTITY % xhtml-special SYSTEM "xhtml-special.ent">
%xhtml-special;
]>
<test>Here is a left double quote: &ldquo;</test>

【讨论】:

我添加了一个实现示例。我希望你不要介意。如果这不是您的意思,请随时删除我的编辑。 酷,不错的@DevNull 不知道你能做到这一点。那么“test (#PCDATA)”是否告诉解析器“test”是已解析的字符数据? 表示test元素可以包含“解析的字符数据”(纯文本)。 DOM (Chrome) 看起来像:&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html&gt; &lt;head&gt;&lt;/head&gt;&lt;body&gt;] &amp;gt; 所以它没有被正确解析并且冗余]> 字符被插入到正文中 FileNotFoundException: xhtml-special.ent

以上是关于如何在有效的 XML 文档中定义 HTML 实体引用?的主要内容,如果未能解决你的问题,请参考以下文章

XML DTD详解

XXE攻防——XML外部实体注入

html和xml里面的文档类型声明(doctype)有啥作用?

XML学习

3. XML实体注入漏洞的利用与学习

开发安全规约(三)——XML最佳安全实践