如何将HTML实体包含到XML文件中

时间:2012-12-04 16:34:44

标签: html xml html-entities mathml

在firefox中:

<?xml version="1.0" encoding="utf-8"?>
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
  <mi>&rho;</mi>
</math>

导致“未定义的实体”错误。

我知道那里缺少一些东西。我只是不知道应该写什么来纠正这个问题。我想避免将每个unicode字符重写到文档中。

编辑我尝试了以下操作,仍然无效,同样的错误:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE math [
  <!ENTITY % HTMLlat1 PUBLIC
    "-//W3C//ENTITIES Latin 1 for XHTML//EN"
    "xhtml-lat1.ent">
  %HTMLlat1;
  <!ENTITY % HTMLsymbol PUBLIC
    "-//W3C//ENTITIES Symbols for XHTML//EN"
    "xhtml-symbol.ent">
  %HTMLsymbol;
  <!ENTITY % HTMLspecial PUBLIC
    "-//W3C//ENTITIES Special for XHTML//EN"
    "xhtml-special.ent">
  %HTMLspecial;
]>
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
  <mi>&rho;</mi>
</math>

编辑在Chrome中,会产生以下消息:

error on line 6 at column 13: PEReference: %HTMLlat1; not found
warning on line 10 at column 15: PEReference: %HTMLsymbol; not found
warning on line 14 at column 16: PEReference: %HTMLspecial; not found

编辑尝试下载.ent文件并将引用更改为本地http://路径或file:///路径,但没有成功。 关于该主题的类似帖子:XML catalog in PHP

编辑浏览器的快速解决方法:

<!DOCTYPE html>
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
  <mi>&rho;</mi>
</math>

您需要禁止XML标头,因此它被理解为HTML。

然而,这并没有回答这个问题,因为问题是导入实体,而文档被声明为XML。

ANSWER

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
  <mi>&rho;</mi>
</math>

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在XML声明之后添加MathML 2.0 doctype:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE math
    PUBLIC "-//W3C//DTD MathML 2.0//EN"
           "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"
>

原因是在Web浏览器中处理实体引用非常麻烦。他们实际上并没有阅读DTD。相反,它们具有预定义实体的内置表,可以使用特定的doctype字符串打开它们。这是字符串魔法,例如使用MathML 3.0 doctype将无法正常工作。参看到XML to XHTML using XSLT: using entities such as &Sum; (which is a MATHML entity)(特别是Martin Honnen对答案的评论)。

或者,使用字符本身,或者,如果您的创作系统无法方便地生成字符,请使用&#x3c1;等字符引用。

答案 2 :(得分:1)

请注意,XHTML1和MathML2中的定义现已过时,并且与当前浏览器中HTML解析器内置的定义不一致。 MathML3和HTML5中使用的当前定义在此处定义

http://www.w3.org/2003/entities/2007doc/Overview.html

这是编辑(我的:-)草稿,在REC版本的顶部有一个链接。

实体的单个DTD声明文件集是

http://www.w3.org/2003/entities/2007/htmlmathml-f.ent

一般来说,最好在XML上下文中使用数字引用而不是命名实体,因为浏览器不会获取外部引用的DTD。

如果您通过公共标识符引用xhtml或mathml2 dtd(即它们不使用您指定的实体定义),则遵循HTML(5)规范的浏览器将使用从上述规范派生的内置定义集

查看针对HTML规范的相关错误

https://www.w3.org/Bugs/Public/show_bug.cgi?id=13409