24

我正在尝试设置 xmldoc 的 innerxml 但得到异常:引用未声明的实体

XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α   – —"
xmldoc.InnerXml = "<p>" + text + "</p>";

这会引发异常:

引用未声明的实体“alpha”。第 2 行,位置 2..

我将如何解决这个问题?

4

9 回答 9

28

XML,不像 HTML 没有定义实体(即对 UNICODE 字符的命名引用),所以 α — 等不翻译成相应的字符。您必须改用数值。您只能使用 < 和& 在 XML 中

如果要创建 HTML,请改用 HtmlDocument。

于 2008-11-11T18:11:46.273 回答
13

在 .Net 中,您可以使用System.Xml.XmlConvert该类:

string text = XmlConvert.EncodeName("Hello &alpha;");

或者,您可以通过将声明放在 DOCTYPE 声明中的方括号之间来在本地声明实体。将以下标头添加到您的 xml:

<!DOCTYPE documentElement[
<!ENTITY Alpha "&#913;">
<!ENTITY ndash "&#8211;">
<!ENTITY mdash "&#8212;">
]>

在“html 字符实体”上搜索实体定义。

于 2009-05-09T06:50:09.193 回答
6

尝试将 &Alpha 替换为

  &#913;
于 2008-11-11T18:06:32.993 回答
6

前面的答案是对的。另一种选择是将您的 html 文档链接到定义这些字符实体的 DTD,这是标准的 XHTML DTD 定义。您的 xml 文件应包含以下声明:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
于 2008-11-11T18:21:14.600 回答
1

使用字符串 System.Net.WebUtility.HtmlDecode(string) 将所有 HTML 实体编码字符解码为其 Unicode 变体。它可从 dot.net 框架 4 获得

于 2014-02-28T09:13:36.573 回答
1

https://stackoverflow.com/a/842836/15178054中描述的解决方案的变体 是:在单独的文件中声明实体,然后从 XML 声明子集中引用该文件。下面是一个如何在 XSLT 样式表中使用 HTML 实体的示例。

<!DOCTYPE xsl:stylesheet
[
<!ENTITY % htmlentities SYSTEM "html-entity-list.ent">
%htmlentities;
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"...>

带有实体的外部文件是“html-entitiy-list.ent”。我是从https://html.spec.whatwg.org/entities.json生成的。生成文件中的一个示例条目是:

<!ENTITY Auml "Ä">
于 2021-02-22T09:28:12.123 回答
0

您还可以将 InnerText 设置为"Hello, I am text α – —",使 XmlDocument 自动转义它们。我认为。

于 2008-11-11T18:24:47.697 回答
0

HtmlDocument 的使用不适合我的情况,我们的系统有一个自定义的 XmlUrlResolver,我们使用它来加载 xml。

//setup
public class CustomXmlResolver : XmlUrlResolver { /* ... */ }
String originalXml; //fetched xml with html entities in it

var doc = new XmlDocument();
doc.XmlResolver = new AdCastXmlResolver();

//making use of a transitional dtd
doc.LoadXml("<!DOCTYPE html SYSTEM \"xhtml1-transitional.dtd\" > " + originalXml);
于 2010-02-17T22:43:57.270 回答
0

如果您确实想使用您习惯的 HTML 实体名称,W3C 已经为您提供了覆盖并生成了“字符的 XML 实体定义” http://www.w3.org/TR/xml-entity-names/,它本质上是一个与 HTML 非常相似的命名实体列表。但如上所述,这不是内置在 XML 中的,需要由想要使用这些命名实体的 XML 应用程序显式支持。

于 2016-01-04T08:36:37.160 回答