使用XML时引用未声明的实体异常

时间:2008-11-11 18:04:54

标签: c# xml dtd

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

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

抛出异常:

  

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

我将如何解决这个问题?

9 个答案:

答案 0 :(得分:26)

与HTML不同,XML不定义实体(即对UNICODE字符的命名引用),因此&amp; alpha; &安培; MDASH;等不会转换为相应的字符。您必须使用数值。你只能使用&amp; lt;和&amp; amp;在XML

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

答案 1 :(得分: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字符实体”上为实体定义做一个谷歌。

答案 2 :(得分:6)

尝试用

替换&amp; Alpha
  &#913;

答案 3 :(得分:6)

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

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">

答案 4 :(得分:1)

描述的解决方案的变体 https://stackoverflow.com/a/842836/15178054 is:在单独的文件中声明实体,然后从 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 "Ä">

答案 5 :(得分:0)

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

答案 6 :(得分: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);

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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