2015-05-28 37 views
3

我想一個字符串如何使用C#中的棘手字符替換?

<?xml version="1.0" encoding="UTF-8"?> 
<response success="true"> 
<output><![CDATA[ 

而且

]]></output> 
</response> 

一無所有內更換。 我遇到的問題是字符<>和「字符在替換中相互作用,意思是,它不是將整行字符串作爲一個整體讀入這些行,而是在涉及到<>或」時斷開字符串「。這裏是我有什麼,但我知道這是不對的:

String responseString = reader.ReadToEnd(); 
      responseString.Replace(@"<<?xml version=""1.0"" encoding=""UTF-8""?><response success=""true""><output><![CDATA[[", ""); 
      responseString.Replace(@"]]\></output\></response\>", ""); 

什麼是正確的代碼,以獲得更換爲只是一個字符串看到這行?

+2

您是否考慮過XML實體像'&#x5564;'?這可能是你需要處理的其他事情。您可能需要[使用XML解析功能](http://stackoverflow.com/questions/12490637/xml-parsing-reading-cdata)。 – zneak

+0

爲什麼你不使用正則表達式? https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx – tdbeckett

+0

@ user3444160這篇文章解釋了爲什麼http://stackoverflow.com/a/1732454/668272 – Bas

回答

4

一個字符串永遠不會改變。該Replace方法的工作原理如下:

string x = "AAA"; 
string y = x.Replace("A", "B"); 
//x == "AAA", y == "BBB" 

然而,真正的問題是你如何處理XML響應數據。


您應該重新考慮通過字符串替換處理傳入XML的方法。只需使用標準XML庫獲取CDATA內容即可。這很簡單:

using System.Xml.Linq; 
... 
XDocument doc = XDocument.Load(reader); 
var responseString = doc.Descendants("output").First().Value; 

CDATA已經被刪除。 This tutorial將教授更多關於在C#中使用XML文檔的知識。

0

鑑於你的文檔結構,你可以簡單地說是這樣的:

string response = @"<?xml version=""1.0"" encoding=""UTF-8""?>" 
       + @"<response success=""true"">" 
       + @" <output><![CDATA[" 
       + @"The output is some arbitrary text and it may be found here." 
       + "]]></output>" 
       + "</response>" 
       ; 
XmlDocument document = new XmlDocument() ; 
document.LoadXml(response) ; 

bool success ; 
bool.TryParse(document.DocumentElement.GetAttribute("success"), out success) ; 

string content = document.DocumentElement.InnerText ; 

Console.WriteLine("The response indicated {0}." , success ? "success" : "failure") ; 
Console.WriteLine("response content: {0}" , content) ; 

而且在控制檯上看到預期的結果:

The response indicated success. 
response content: The output is some arbitrary text and it may be found here. 

如果你的XML文檔更一丁點複雜,您可以使用XPath查詢輕鬆選擇所需的節點,因此:

string content = document.SelectSingleNode(@"/response/output").InnerText;