我正在解析存储在数据库中的一些C#脚本,提取代码中某些方法的主体,然后编写一个显示id的XML文件,提取方法的主体等等。
我现在写的问题是,当我在XML中编写代码时,我必须将其写为文字字符串,所以我认为我需要在开头和结尾添加"
:< / p>
new XElement("MethodName", @"""" + Extractor.GetMethodBody(rule.RuleScript, "MethodName") + @"""")
这样可行,但我有一个问题,那就是在DB中写的
for (int n = 1; n < 10; n++)
将写入XML文件(或打印到控制台):
for (int n = 1; n < 10; n++)
如何让它打印实际字符而不是代码?数据库中的代码是用实际的字符编写的,而不是像“安全”<
那样。
答案 0 :(得分:7)
在xml内部(作为文本值),<
的<{>>正确被编码为<
。 xml的内部表示不会影响该值,因此请对其进行编码。你可以通过强迫CDATA section解决这个问题,但是老实说 - 这是不值得的。但这是一个使用CDATA的例子:
string noEncoding = new XElement("foo", new XCData("a < b")).ToString();
答案 1 :(得分:1)
为什么你认为你必须把它写成文字字符串?事实并非如此。此外,你根本不是把它写成文字字符串,它只是一个动态字符串值,只是你在它周围添加了引号。
文字字符串是代码中写入的字符串,如"Hello world"
。如果你以任何其他方式获得字符串,那么它不是文字字符串。
您添加到字符串的引号只是在值中添加引号,它们对字符串不做任何其他操作。您可以添加带引号的字符串:
new XElement("MethodName", Extractor.GetMethodBody(rule.RuleScript, "MethodName"))
现在,将它们放入XML时编码的字符是因为它们需要进行编码。如果不对其进行编码,则不能在值中放置<
字符。
如果您显示XML,您将看到编码值,这只是它应该工作的标志。当您阅读XML时,编码的字符将被解码,您最终会得到原始字符串。
答案 2 :(得分:1)
我不知道他将使用什么软件来读取XML,但是我所知道的任何软件都会在解析任何不会转义的XML时抛出错误&lt;和&gt;不用作标签的字符开始和结束。它只是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>");
}