【问题标题】:An error occurred while parsing EntityName. Line1, position 844解析 EntityName 时出错。第 1 行,位置 844
【发布时间】:2023-03-06 09:51:01
【问题描述】:

我从下面的代码块中得到了以下异常。

解析 EntityName 时出错。第 1 行,位置 844。

我试图将从表中检索到的数据集解析为数据集。

public DataSet BindMasterData(string xml)
        {
            DataSet ds = null;
            try
            {
                ds = new DataSet();
                TextReader txtReader = new StringReader(xml);
                XmlReader reader = new XmlTextReader(txtReader);
                ds.ReadXml(reader);
            }
            catch (Exception ex)
            {
                return new DataSet();
            }
            return ds;
        }

我已经找出异常的原因,但我无法解决它。在这种特殊情况下,字符串(从 DB 中检索)包含一个特殊字符 (&)。这会导致异常。我怎么能解决它。对此的任何帮助都会很棒。

【问题讨论】:

  • 请显示文档中导致异常的部分。
  • 字符串包含&。对于前。 A & B 结构

标签: c# xml


【解决方案1】:

只需替换它们:

在 XML 元素中无效:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

  public static string UnescapeXMLValue(string xmlString)
  {
    if (xmlString == null)
        throw new ArgumentNullException("xmlString")
    
    return xmlString.Replace("&apos;", "'").Replace("&quot;", "\"").Replace("&gt;", ">").Replace("&lt;", "<").Replace("&amp;", "&");
  }
 
 public static string EscapeXMLValue(string xmlString)
  {

    if (xmlString == null)
        throw new ArgumentNullException("xmlString")

    return xmlString.Replace( "&","&amp;").Replace("'","&apos;").Replace( "\"", "&quot;").Replace(">","&gt;").Replace( "<","&lt;");
  }

【讨论】:

  • 如果像这样对 Replace 函数进行字符串化,很容易导致错误。例如“Dave's”将首先变为“Dave's”,然后变为“Dave's”,显示为“Dave's”。这在某些网站上经常出现,因为有人犯了错误。我建议您不要尝试使用替换,而是查看stackoverflow.com/questions/8331119/…
  • Replace("&","&") 应该在你的方法中首先调用,否则会发生像">"变成"&gt;"这样的事情,那就错了。
  • return xmlString.Replace("'","&amp;apos;").Replace( "\"", "&amp;quot;").Replace("&gt;","&amp;gt;").Replace( "&lt;","&amp;lt;").Replace( "&amp;","&amp;amp;"); - 最后一部分将找到之前插入的&amp; 并将它们替换为&amp;amp
  • "&amp;" 替换"&amp;amp;" 给了我同样的错误;只有当我用常规字符串替换时,解析才起作用
【解决方案2】:

这已经得到解答,但是通过使用 Escape 方法在 .NET 4.5 中执行此操作,找到了实现相同结果的更好方法,如下所示:

var xmlWithEscapedCharacters = SecurityElement.Escape(xmlWithoutEscapedCharacters);

然后将该字符串插入正在生成的 XML 中。

链接:MSDN - SecurityElement.Escape Method

【讨论】:

【解决方案3】:

如果您的 XML 是用字符串连接构造的,那么您会想要转义它。 &amp;amp; 应该变成 &amp;amp;&amp;lt;&amp;gt; 应该分别变成 &amp;lt;&amp;gt;

可能还有其他人。 当然,您应该真正使用合适的 XML 编码器,而不是出于多种原因自己尝试。

【讨论】:

    【解决方案4】:

    由于数据来自某个数据库,因此可以在您描述的上下文中对问题进行热修复,但我强烈建议采用不同的方法。正如here 所讨论的那样,与符号最初不应该出现在 xml 中。请说明xml是如何生成的并解决那里的问题。

    【讨论】:

      【解决方案5】:

      您可以使用:SecurityElement.Escape(XML string)

      参考链接:https://msdn.microsoft.com/en-us/library/system.security.securityelement.escape(v=vs.110).aspx

      【讨论】:

      • 不幸的是,它与普通替换产生了相同的问题。我像 var tagText = SecurityElement.Escape("jsskhfkj & nln &");并得到 - “jsskhfkj & nln &amp;”。所以你看到了 &表示“&amp;”。
      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2020-11-26
      • 2012-06-12
      • 2020-01-15
      • 2011-10-28
      相关资源
      最近更新 更多