替换&与&在C#中

时间:2010-09-30 19:42:09

标签: c# string

好的,我觉得这很愚蠢。我看到很多类似于我的问题的其他问题,但似乎没有人能够回答它。

我正在为一个非常挑剔语法的程序创建一个xml文件。可悲的是,我从头开始制作XML文件。意思是,我将每一行单独放置(大量的file.WriteLine(String))。

我知道这很难看,但这是我能让逻辑解决的唯一方法。

反正。我有一些字符串与'&'一起出现在他们中间。

if (value.Contains("&"))
   {
      value.Replace("&", "&");
   }

似乎不起作用。 value.Contains()似乎看到它,但替换不起作用。我正在使用C#.Net 2.0 sp2。 VS 2005。

请帮帮我..这是一个漫长的一周..

12 个答案:

答案 0 :(得分:30)

如果你真的想要去那条路线,你必须将Replace的结果(该方法返回一个新的字符串,因为字符串是不可变的)分配给变量:

value = value.Replace("&", "&");

我建议您重新考虑编写XML的方式。如果您切换到使用XmlTextWriter,它将为您处理所有编码(不仅是&符号,还包括需要编码的所有其他字符):

using(var writer = new XmlTextWriter(@"C:\MyXmlFile.xml", null))
{
    writer.WriteStartElement("someString");
    writer.WriteText("This is < a > string & everything will get encoded");
    writer.WriteEndElement();
}

应该产生:

<someString>This is &lt; a &gt; string &amp; 
    everything will get encoded</someString>

答案 1 :(得分:7)

你应该使用像Linq到XML(XDocument等)来解决它。我百分百肯定你可以在没有WriteLine的情况下完成它;)向我们展示你的逻辑吗?

否则你可以使用这将是防弹(而不是.Replace("&")):

var value = "hej&hej<some>";
value = new System.Xml.Linq.XText(value).ToString(); //hej&amp;hej&lt;some&gt;

这也将照顾你也必须逃脱的<:)

更新:我查看了XText.ToString()的代码,并在内部创建了XmlWriter + StringWriter并使用了XNode.WriteTo。这对于给定的应用程序来说可能有点过分,因此如果要转换许多字符串,XText.WriteTo会更好。 System.Web.HttpUtility.HtmlEncode是一种快速和依赖的替代方案。

更新2:我发现这个System.Security.SecurityElement.Escape(xml)可能是最快的,并确保最大兼容性(从.Net 1.0开始支持,不需要System.Web参考)。

答案 2 :(得分:3)

您也可以在System.Web命名空间下使用HttpUtility.HtmlEncode类,而不是自己进行替换。 你去吧:http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

答案 3 :(得分:3)

您可以使用Regex替换char“&amp;”仅在节点值中:

输入数据示例(字符串)

<select>
 <option id="11">Gigamaster&Minimaster</option>
 <option id="12">Black & White</option>
 <option id="13">Other</option>
</select>

替换为Regex

 Regex rgx = new Regex(">(?<prefix>.*)&(?<sufix>.*)<");
 data = rgx.Replace(data, ">${prefix}&amp;${sufix}<");

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(data);

结果数据

<select>
 <option id="11">Gigamaster&amp;MiniMaster</option>
 <option id="12">Black &amp; White</option>
 <option id="13">Other</option>
</select>

答案 4 :(得分:2)

显然非常晚,但正确答案是:

var $el = $('.book-button-handle')
var $wrapper = $el.find('.handle-content');
var enter = false;
var exit = false;

var changeContent = function (content) {
    $wrapper.fadeOut(50, function () {
        $wrapper.html('<span class="handle-content">' + content + '</span>').fadeIn(50);
    });
};

var labelChanger = function (off, on) {
    $el.off('mouseenter').off('mouseleave');
    $el.on({
        mouseenter: function (e) {
          if (!$(this).is(':animated') && !enter){
          	changeContent(on);
            $(this).animate({
              'width': '50%',
              'height': '15px',
              'color': 'white',
              'background-color': 'black'
            }, 50);
            $('.log').append('<li>enter</li>');
            enter=true;
            exit=false;
          } 
        },
        mouseleave: function (e) {
        	if (!$(this).is(':animated') && !exit){
            changeContent(off);
            $(this).animate({
              'width': '70%',
              'height': '15px',
              'color': 'black',
              'background-color': 'white'
            }, 50);
            $('.log').append('<li>leave</li>');
            enter=false;
            exit=true;
          }
        }
    });
};


labelChanger("+","more options");

希望这有助于某人!

答案 5 :(得分:1)

您可以尝试:

value = value.Replace("&", "&amp;");

答案 6 :(得分:1)

字符串是不可变的。你需要写:

value = value.Replace("&", "&amp;");

请注意,如果您执行此操作且字符串包含"&amp;",则会将其更改为"&amp;amp;"

答案 7 :(得分:1)

我创建了以下函数来编码&amp;并且'没有弄乱已经编码过的&amp;或'或'

    public static string encodeSelectXMLCharacters(string xmlString)
    {
        string returnValue = Regex.Replace(xmlString, "&(?!quot;|apos;|amp;|lt;|gt;#x?.*?;)|'",
            delegate(Match m)
            {
                string encodedValue;
                switch (m.Value)
                {
                    case "&":
                        encodedValue = "&amp;";
                        break;
                    case "'":
                        encodedValue = "&apos;";
                        break;
                    default:
                        encodedValue = m.Value;
                        break;
                }

                return encodedValue;
            });
        return returnValue;
    }

答案 8 :(得分:0)

怎么样?
Value = Server.HtmlEncode(Value);

答案 9 :(得分:0)

不确定这对任何人都有用......我正在争吵一段时间......这是一个光荣的正则表达式,你可以用它来修复你的所有链接,javascript,内容。我不得不处理大量遗留内容,没有人愿意纠正。

将其添加到母版页中的渲染覆盖,控制或重新编码以通过它运行字符串。请不要因为把它放在错误的地方而激怒我:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);

对于渲染页面来说,这是一个广泛的笔划,但这可以适应多种用途而不会炸毁你的页面。

答案 10 :(得分:0)

在这里很晚,但是我想分享我的解决方案,该解决方案可以处理文档中除其他xml字符实体外还具有&(不正确的xml)和&(有效的xml)的情况。

此解决方案仅适用于无法控制xml生成的情况,通常是因为它来自某些外部来源。如果您控制xml的生成,请使用@Justin Niessner建议的XmlTextWriter

它也非常快,可以处理所有不同的xml字符实体/引用

预定义字符实体:

&amp;

&lt;

&gt;

数字字符实体/引用:

&#nnnn;

&#xhhhh;

PS! &后面的空格不应包含在实体/引用中,我只是在此处添加了它,以避免在页面渲染中被编码

代码

    public static string CleanXml(string text)
    {
        int length = text.Length;
        StringBuilder stringBuilder = new StringBuilder(length);

        for (int i = 0; i < length; ++i)
        {
            if (text[i] == '&')
            {
                var remaining = Math.Abs(length - i + 1);
                var subStrLength = Math.Min(remaining, 12);
                var subStr = text.Substring(i, subStrLength);
                var firstIndexOfSemiColon = subStr.IndexOf(';');
                if (firstIndexOfSemiColon > -1)
                    subStr = subStr.Substring(0, firstIndexOfSemiColon + 1);
                var matches = Regex.Matches(subStr, "&(?!quot;|apos;|amp;|lt;|gt;|#x?.*?;)|'");
                if (matches.Count > 0)
                    stringBuilder.Append("&amp;");
                else
                    stringBuilder.Append("&");
            }
            else if (XmlConvert.IsXmlChar(text[i]))
            {
                stringBuilder.Append(text[i]);
            }
            else if (i + 1 < length && XmlConvert.IsXmlSurrogatePair(text[i + 1], text[i]))
            {
                stringBuilder.Append(text[i]);
                stringBuilder.Append(text[i + 1]);
                ++i;
            }
        }

        return stringBuilder.ToString();
    }

答案 11 :(得分:0)

我很确定,如果您用CDATA“拥抱”您的价值,那么它会起作用,因此结果是类似的

<ampersandData><![CDATA[value with ampersands like &hellip;]]></ampersandData>

希望有帮助。
迈克尔

相关问题