【问题标题】:XmlDocument throwing "An error occurred while parsing EntityName"XmlDocument 抛出“解析 EntityName 时发生错误”
【发布时间】:2011-11-30 03:02:20
【问题描述】:

我有一个函数,我将一个字符串作为参数传递,称为 filterXML,其中一个属性包含“&”。

我知道 XML 不会识别它,它会给我一个错误。这是我的代码:

 public XmlDocument TestXMLDoc(string filterXml)
{
    XmlDocument doc = new XmlDocument();
    XmlNode root = doc.CreateElement("ResponseItems");

    // put that root into our document (which is an empty placeholder now)
    doc.AppendChild(root);

    try
    {
        XmlDocument docFilter = new XmlDocument();
        docFilter.PreserveWhitespace = true;

        if (string.IsNullOrEmpty(filterXml) == false)
            docFilter.LoadXml(filterXml); //ERROR THROWN HERE!!!

我应该在我的代码中更改什么来编辑或解析 filterXml?我的 filterXml 看起来像这样:

<Testing>
<Test>CITY & COUNTY</Test>
</Testing>

我正在将字符串值从 & 更改为 &。这是我的代码:

string editXml = filterXml;
    if (editXml.Contains("&"))
    {
        editXml.Replace('&', '&amp;');
    }

但它在 if 语句内部给了我一个错误:文字太多。

【问题讨论】:

  • 因为与号 (&) 而出错
  • 这是游戏后期,但万一其他人偶然发现它 - “文字太多”错误是由于 Gunda 在他的“&”周围使用单引号引起的。单引号表示字符,只能是单个字符。

标签: c# xml string xmldocument


【解决方案1】:

上面显示的文件不是格式正确的 XML,因为 & 符号没有转义。

你可以试试:

<Testing>
  <Test>CITY &amp; COUNTY</Test>
</Testing>

或:

<Testing>
  <Test><![CDATA[CITY & COUNTY]]></Test>
</Testing>

【讨论】:

  • 我正在做这样的事情:string editXml = filterXml; if (editXml.Contains("&")) { editXml.Replace('&', '&'); }
  • 选项 2 总体来说有点矫枉过正,在这种情况下不是很有用。
  • 我建议谨慎行事。如果您确定所有&符号“格式不正确”,这将起作用。如果您的输入 XML 文档格式正确并且包含实体或字符引用,那么这样做可能会破坏它们(例如,格式正确的 & 将更改为 &amp;)。如果您对此有控制权,那么在数据流的早期(当生成 filterXml 的内容时)确保格式正确可能会更容易。
【解决方案2】:

要在 XML 中指定 & 符号,您应该使用 &amp;amp;,因为 & 符号 ('&') 在 XML 中具有特殊含义。

【讨论】:

    【解决方案3】:

    关于第二个问题:String.Replace 有两个签名。一个接受字符,另一个接受字符串。使用单引号尝试构建字符文字 - 但对于 C#,“&”实际上是一个字符串(它有五个字符)。

    它可以使用双引号吗?

    editXml.Replace("&", "&amp;");
    

    如果您想更保守一点,您还可以编写代码以确保您要替换的 &s 后面不跟一个

    amp; quot; apos; gt; lt; or #
    

    (但这仍然不是一个完美的过滤)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多