2009-09-22 103 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文檔可能會變得很大。