XML中的特殊字符

时间:2008-10-16 15:58:54

标签: xml xslt special-characters dtd entities

我正在创建一个使用xml和xsl的左导航系统。在我尝试在xml文档中使用特殊字符之前,一切都很顺利。我正在使用»,我得到了错误。

  

原因:引用未定义的实体'raquo'。
  错误代码:-1072898046

我如何使这项工作?

9 个答案:

答案 0 :(得分:21)

您正在尝试在非HTML或非XHTML文档中使用HTML entity。这些实体在文档Document Type Definition (DTD)中声明。

您应该使用entity reference的数字Unicode版本。例如,对于»,您应该使用»

或者,你可以define them in your XML document's DTD

<!ENTITY entity-name "entity-value">
<!ENTITY raquo "&#187;">

否则,如果您的文档是UTF-8,我相信您可以直接在XML文档中使用实际字符。

»

答案 1 :(得分:6)

您是否为文件指定了文档类型?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

如果您忘记指定它,我认为您可能会遇到此类错误。

如果您按照数字而不是名称指定实体,有时实体也会起作用。

&#187; &#171; instead of &raquo; and &laquo;

答案 2 :(得分:3)

您无需在DTD中声明实体,甚至使用 DTD。您可能不需要使用该字符的Unicode表示。您当然不需要使用CDATA部分。

您需要做的是使用DOM来构建XML,而不是尝试使用字符串操作来构建它。 DOM将为您解决此问题。

在C#中,此代码:

 XmlDocument d = new XmlDocument();
 d.LoadXml("<foo/>");
 char c = (char)187;
 d.DocumentElement.InnerText = "Here's that character: " + c;
 Debug.WriteLine(d.OuterXml);
 d.DocumentElement.InnerText = "Here it is as an HTML entity: &raquo;";
 Debug.WriteLine(d.OuterXml);

生成此输出:

<foo>Here's that character: »</foo>
<foo>Here it is as an HTML entity: &amp;raquo;</foo>

从第一个示例中可以看出,»字符在XML文本中是完全合法的。但我认为你并不想代表这个角色。

我认为您正在尝试根据您报告的错误消息执行第二个示例中的操作。您正试图表示字符串&raquo;。在XML文本中表示该字符串的正确方法是转义&符号;因此:&amp;raquo;

因此,如果您必须使用字符串操作来构建XML,请确保您转义源数据中的任何&符号。不要强调这一点,但如果您使用的是DOM,那么这将自动为您完成。

另一件事。很可能在您的原始问题中,现在显示“我正在使用”,您实际上键入的是“我正在使用&amp; raquo;”。但实际的帖子看起来并不像那样。如果您需要在markdown中逐字表示文本,请将其括在反引号中;否则,HTML实体将在呈现帖子时转换为其角色表示。

答案 3 :(得分:1)

这是一个问题,因为并非所有HTML实体都是XML实体。您可以像Pat建议的那样将HTML的DTD导入到文档中,或者执行以下操作之一:

用数字实体代码替换所有特殊字符的出现:

&raquo; becomes &#187;

将所有特殊字符包含在CDATA标记

<![CDATA[&raquo;]]>

在文档顶部定义实体

<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "&#187;"> ]>

答案 4 :(得分:0)

您是直接使用»符号还是将其定义为&amp; raquo; ?如果您使用的是转义符号,您是否忘记了分号?

答案 5 :(得分:0)

当我使用unicode版本显示正方形时。

将实体decalration放入xml doc会产生“不能在DTD之外进行DTD声明”。错误。我想这是预期的。

当我使用''在外部包含dtd时,它似乎没有任何效果。

我想知道这可能是服务器问题。我正在本地开发这个并使用Baby Web Server。

答案 6 :(得分:0)

只需将您的HTML实体&raquo;替换为任何XML和HTML中的数字参考&#187;

答案 7 :(得分:0)

我发现自己谷歌搜索了很多这样的信息,所以决定在我自己的网站上发布一个矩阵,其目的很简单,就是可以快速查找:

http://martinkool.com/characters

使用&amp;#...;形式确实。

答案 8 :(得分:0)

如果希望输出文档包含命名的HTML实体&raquo;而不是数字引用,请将以下元素添加到样式表中(仅限XSLT2.0 ):

<xsl:output use-character-maps="raquo.ent"/>
<xsl:character-map name="raquo.ent">
    <xsl:output-character character="&#187;" string="&amp;raquo;"/>
</xsl:character-map>