2009-09-22 106 views
2

我有我从阅读的字符串:C#字符串替换,不工作

TextReader tr = new StreamReader(this.dataPath); 
string contents = tr.ReadToEnd(); 

的含量值开头:

"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n....." 

当我尝试执行

 string styleSheet = "<?xml-stylesheet type=\"text/xsl\" href=\"message.xsl\"?>"; 
     string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
     TextReader tr = new StreamReader(this.dataPath); 
     string contents = tr.ReadToEnd(); 
     contents.Replace(xmlString,xmlString + styleSheet); 

它绝对不会找到XmlString的第一次出现。任何想法为什么?

+2

.net中很常见的逻辑问题。当我第一次开始的时候,它还有我。但我很高兴它可以这样工作。 – corymathews 2009-09-22 17:21:00

+0

感谢JL没有发布“omg,string.Replace在.net中被破坏!” – Armbrat 2009-09-22 17:27:36

+3

如果Replace是一个静态方法而不是实例方法,并且/或者如果Visual Studio会给你“返回值未被使用”警告,那将会很好。 – JulianR 2009-09-22 17:40:42

回答

27

尝试

contents = contents.Replace(xmlString,xmlString + styleSheet); 

这是因为String类是不可变的。

+1

+1 - 一个经典的,不可变字符串类 – 2009-09-22 17:18:43

+0

的效果我以前一直这么做。 – 2009-09-22 17:22:49

+0

@Ed我仍然不时做:) – 2009-09-22 17:26:45

3

你可能想这样做:

string styleSheet = "<?xml-stylesheet type=\"text/xsl\" href=\"message.xsl\"?>"; 
string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
TextReader tr = new StreamReader(this.dataPath); 
string contents = tr.ReadToEnd(); 
string result = contents.Replace(xmlString,xmlString + styleSheet); 

你目前没有捕捉,你就上线做替换结果。

5

的Replace()方法返回一个新的字符串对象,所以你必须对你的代码更改为:

content = contents.Replace(xmlString,xmlString + styleSheet); 
2

System.String是不可改变的。像Replace这样的操作会返回一个新字符串,而不是修改this字符串。如果您确实需要可变字符串或仅将Replace调用的结果分配给变量,请使用System.Text.StringBuilder

1

要获取技术(谁不爱),如果你正在寻找string`

<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n..... 

搜索字符串必须是

"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n" 

@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" 
1

这并不能真正回答你的问题,但已经有不止一次的回答了,所以请允许我抛开这个问题。

我见过很多情况下人们将一个流的内容读入一个字符串,以便可以完成一些非常简单的操作。在许多情况下,当然这种情况下,操作可以在没有复制整个字符串的情况下执行,并且可以执行。

通过比现有代码更多的努力,您可以编写一个StreamStringReplace方法,该方法将输入流,输出流,查找字符串和替换字符串作为其参数。这将会更有效,特别是如果你的XML文档可能会变得很大。