2010-11-18 127 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

相关问题