【问题标题】:Reference to undeclared entity exception while working with XML使用 XML 时引用未声明的实体异常
【发布时间】:2010-09-21 20:29:46
【问题描述】:

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

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

这会引发异常:

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

我将如何解决这个问题?

【问题讨论】:

    标签: c# xml dtd


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      尝试用

      替换 &Alpha
        &#913;
      

      【讨论】:

        【解决方案4】:

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

         <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                    "http://www.w3.org/TR/html4/strict.dtd">
        
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          描述的解决方案的变体 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 "Ä">
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              在我的情况下不适合使用 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);
              

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-01-03
                  • 2010-11-10
                  • 1970-01-01
                  • 2021-05-07
                  • 2017-03-27
                  • 2015-10-12
                  相关资源
                  最近更新 更多