解析EntityName时发生错误.第1行,位置844

Seb*_*ier 31 c# xml

我从以下代码块中得到以下异常.

解析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;
        }
Run Code Online (Sandbox Code Playgroud)

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

谢谢你,塞巴斯蒂安

Bas*_*ili 65

只需更换它们:

在XML元素中无效:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;
Run Code Online (Sandbox Code Playgroud)
  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("'","&apos;").Replace( "\"", "&quot;").Replace(">","&gt;").Replace( "<","&lt;").Replace( "&","&amp;");
  }
Run Code Online (Sandbox Code Playgroud)

  • 如果您将Replace函数串起来,则很容易导致错误.例如,"Dave's"将首先成为"Dave's",然后将成为"Dave&amp; s",其将显示为"Dave's".在某些网站上经常出现这种情况,因为有人犯了错误.我建议你不要尝试使用替换,而是查看http://stackoverflow.com/questions/8331119/escape-in​​valid-xml-characters-in-c-sharp (3认同)
  • Replace("&amp;","&amp;") 应该在你的方法中首先调用,否则会发生像 "&gt;" 变成 "&amp;gt;" 的情况,这是错误的。 (3认同)

Ala*_*air 17

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

var xmlWithEscapedCharacters = SecurityElement.Escape(xmlWithoutEscapedCharacters);
Run Code Online (Sandbox Code Playgroud)

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

链接:MSDN - SecurityElement.Escape方法

  • 另外值得注意的是,这也可用于 .NET Core https://apisof.net/catalog/System.Security.SecurityElement.Escape(String) (2认同)