2010-11-18 34 views
0

我目前正在解析一些存儲在數據庫中的C#腳本,提取代碼中某些方法的主體,然後編寫顯示標識,提取方法正文的XML文件等。如何讀寫文本並避免特殊字符(<,>等)

我現在寫的問題是,當我在XML中編寫代碼時,我必須將它寫爲文字字符串,所以我認爲我倒是需要添加"在開頭和結尾:

new XElement("MethodName", @"""" + Extractor.GetMethodBody(rule.RuleScript, "MethodName") + @"""") 

這工作,但我有一個問題,那寫東西在DB作爲

for (int n = 1; n < 10; n++) 

寫入到XML文件(或者打印到控制檯)爲:

for (int n = 1; n &lt; 10; n++) 

我怎樣才能得到它打印的實際字符,而不是它的代碼?數據庫中的代碼是用實際的字符編寫的,而不是像一個「安全」的&lt;

回答

7

內部xml(作爲文本值)它是正確對於<編碼爲&lt;。 xml的內部表示不影響值,所以讓它進行編碼。你可以通過強制CDATA section解決此問題,但在所有誠實 - 這是不值得的。但這裏是一個使用CDATA的例子:

string noEncoding = new XElement("foo", new XCData("a < b")).ToString(); 
+0

謝謝,那也不錯知道..我被要求這樣做的,當他們看到>跡象,但現在我可以告訴他們,就是這樣,它應該是,謝謝! – 2010-11-18 19:01:28

+0

好吧,所以他告訴他,他堅持說他想要的是實際的文本... – 2010-11-18 19:05:29

+0

我發現CDATA是值得的(特別是當您將XML存儲在XML中時)。 – 2010-11-18 19:17:56

1

爲什麼你認爲你必須把它寫成一個文字字符串?事實並非如此。另外,你並沒有把它寫成一個字面字符串,它仍然是一個動態的字符串值,只是你在它周圍增加了引號。

文字字符串是一個字符串,在代碼中被編碼爲litvertly,如"Hello world"。如果以其他方式獲取字符串,則不是字符串。

您添加到字符串的引號只是將引號添加到該值,它們不會對字符串做任何其他操作。你可以用引號就好添加字符串:

new XElement("MethodName", Extractor.GetMethodBody(rule.RuleScript, "MethodName")) 

現在,當它們被放在XML被編碼字符,是因爲他們需要進行編碼。你不能將一個<字符放在一個值中,而不對它進行編碼。

如果您顯示XML,您將看到編碼的值,這只是一個符號,它的工作原理應該如此。當你閱讀XML時,編碼的字符將被解碼,並最終得到原始字符串。

+0

我原本有... [code]但是那個問我的人說他希望它的形式是「[code]」所以他希望它成爲'字符串' – 2010-11-18 19:00:00

+0

@Francisco Noriega:我明白了,這樣做更有意義。看起來你錯過了文字字符串的整個概念。 :) – Guffa 2010-11-18 19:09:18

+0

我認爲他正在將xml粘貼到某個工具中,該工具會將帶引號的文本作爲文字字符串,他說他需要用引號括起來,因爲軟件會格式化/移動代碼,而不是「文字字符串「 – 2010-11-18 19:24:18

1

我不知道他會用什麼軟件來讀取XML,但是我知道的任何東西都會在解析任何不能逃脫的XML時出錯,並且>不會用作標籤啓動的字符並結束。它只是XML規範的一部分;這些字符被保留作爲結構的一部分。

如果我是你,那麼,我將與System.XML實用程序分道揚and,並自己寫這個文件。任何體面的XML工具都會爲你編碼這些字符,所以你可能不應該使用它們。使用StreamWriter進行操作,並按照被告知的方式創建輸出。通過這種方式,您可以自己控制XML輸出,即使這意味着違反XML規範。

using (StreamWriter sw = new StreamWriter("c:\\xmlText.xml", false, Encoding.UTF8)) 
{ 
sw.WriteLine("<?xml version=\"1.0\"?>"); 
sw.WriteLine("<Class>"); 

sw.Write("\t<Method Name=\"MethodName\">"); 
sw.Write(@"""" + Extractor.GetMethodBody(rule.RuleScript, "MethodName") + @""""); 
sw.WriteLine("</Method>"); 

// ... and so on and so forth 

sw.WriteLine("</Class>"); 
}
+0

是的,我認爲他希望XML只是爲了手動讀取代碼,用於手動校對......我們正在從數據庫提取代碼並動態地將其一部分更改爲新代碼......所以他希望能夠得到一些隨機腳本並且證明他們是閱讀的 – 2010-11-18 19:20:44

相關問題