好的,我觉得这很愚蠢。我看到很多类似于我的问题的其他问题,但似乎没有人能够回答它。
我正在为一个非常挑剔语法的程序创建一个xml文件。可悲的是,我从头开始制作XML文件。意思是,我将每一行单独放置(大量的file.WriteLine(String))。
我知道这很难看,但这是我能让逻辑解决的唯一方法。
反正。我有一些字符串与'&'一起出现在他们中间。
if (value.Contains("&"))
{
value.Replace("&", "&");
}
似乎不起作用。 value.Contains()似乎看到它,但替换不起作用。我正在使用C#.Net 2.0 sp2。 VS 2005。
请帮帮我..这是一个漫长的一周..
答案 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 < a > string &
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&hej<some>
这也将照顾你也必须逃脱的<
:)
更新:我查看了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}&${sufix}<");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(data);
结果数据
<select>
<option id="11">Gigamaster&MiniMaster</option>
<option id="12">Black & 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("&", "&");
答案 6 :(得分:1)
字符串是不可变的。你需要写:
value = value.Replace("&", "&");
请注意,如果您执行此操作且字符串包含"&"
,则会将其更改为"&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 = "&";
break;
case "'":
encodedValue = "'";
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 &
//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>)", "&", 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("&");
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 …]]></ampersandData>
希望有帮助。
迈克尔