在XML属性中替换非法字符的最简单方法

时间:2011-11-17 10:51:31

标签: sql-server xml xml-parsing

我在使用手写XML时遇到了麻烦。 XML由concat字符串生成,如下所示:

            ReturnXML += "<agentchimique ";
            ReturnXML += "id_prod=\"" + Produit.Id + "\" ";
            ReturnXML += "nom_com_prod=\"" + Produit.NomComProd + "\" ";
            ReturnXML += "nom_four=\"" + Produit.Fournisseur.NomFour  + "\" ";
            ReturnXML += "PhraseR=\"" + Produit.PhrasesR.Replace( "<br/>", "@" ) + "\" ";
            ReturnXML += "PhraseS=\"" + Produit.PhrasesS.Replace( "<br/>", "@" ) + "\" ";
            ReturnXML += "numfds_prod=\"" + Produit.NumfdsProd.ToString() + "\" ";
            ReturnXML += "transverse_prod=\"" + Produit.TransverseProd.ToString() + "\" ";

这只是整个XML的一小部分,正如您所看到的,所有数据都在属性中...... 但是一些参数如Produit.PhrasesR或Produit.PhrasesS可以包含非法字符&lt; &GT;或&amp;。

此XML在SQL中以文本形式存储并由SQL Server执行,并在报表服务中读取存储过程sp_xml_preparedocument。 此XML也可用作生成网页的数据。

那么,解决这个编码问题的最快,最简单的解决方案是什么,因为知道我不能重写真正的兼容XML(我没有时间做这个),而且这个XML在我的很多地方使用项目(替换字符将是最简单的,但它需要替换报告和网页)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用SecurityElement.Escape

ReturnXML += "nom_four=\"" + SecurityElement.Escape(Produit.Fournisseur.NomFour) + "\" ";

这会将<替换为&lt;,将>替换为&gt;等。

虽然你真的应该使用XDocument来正确构建你的xml。

答案 1 :(得分:1)

你必须用它们的ASCII等价物来逃避它们:

  1. '&LT;'必须变为“&#60;
  2. '&GT;'必须变为“&#62;
  3. '&安培;'必须变为“&#38;
  4. 我所知道的没有捷径。

    我认为您的问题不是SQL。 XML中的魔术字符使其形成不良。您创建的XML是否有效?