使用XML时引用未声明的实体exception

我试图设置xmldoc的innerxml但得到exception:引用未声明的实体

XmlDocument xmldoc = new XmlDocument(); string text = "Hello, I am text α   – —" xmldoc.InnerXml = "

" + text + "

";

这引发了exception:

引用未声明的实体’alpha’。 2号线,2号线..

我该如何解决这个问题?

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

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

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

 string text = XmlConvert.EncodeName("Hello α"); 

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

    ]> 

为实体定义做一个关于“html字符实体”的谷歌。

尝试替换&Alpha

  Α 

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

   

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

在我的情况下使用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(" " + originalXml); 

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

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