代码之家  ›  专栏  ›  技术社区  ›  Francisco Noriega

如何读/写文本和避免特殊字符符号(<、>等)

  •  0
  • Francisco Noriega  · 技术社区  · 14 年前

    我目前正在解析存储在数据库中的一些C脚本,提取代码中某些方法的主体,然后编写一个XML文件,显示id、提取方法的主体等。

    我现在写的问题是,当我用XML编写代码时,我必须把它写成一个文本字符串,所以我想我需要添加 " 在开头和结尾:

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

    这是可行的,但我有个问题,在数据库中写的东西是

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

    写入XML文件(或打印到控制台)的方式如下:

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

    如何让它打印实际字符而不是其代码?数据库中的代码是用实际字符写的,而不是用“safe” &lt; 就像一个。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Marc Gravell    14 年前

    在xml内部(作为文本值) 对的 对于 < 编码为 &lt; . xml的内部表示不影响该值,所以让它进行编码。你 可以 通过强迫 CDATA section 但老实说,这不值得。但这里有一个使用CDATA的示例:

    string noEncoding = new XElement("foo", new XCData("a < b")).ToString();
    
        2
  •  1
  •   Guffa    14 年前

    你为什么认为你必须把它写成一个文字串?事实并非如此。此外,您根本没有将它作为文本字符串编写,它仍然是一个动态字符串值,只是您在它周围添加了引号。

    文字字符串是在代码中很少写入的字符串,如 "Hello world" . 如果以任何其他方式获取字符串,则它不是文本字符串。

    添加到字符串中的引号只是将引号添加到值中,它们不会对字符串执行任何其他操作。您可以添加带引号的字符串:

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

    现在,将字符放入XML时对其进行编码的原因是 需要 要编码。你不能把 < 值中没有编码的字符。

    如果您显示XML,您将看到编码的值,这只是它正常工作的标志。当您读取XML时,编码的字符将被解码,最终得到原始字符串。

        3
  •  1
  •   Lane    14 年前

    我不知道他将使用什么软件来读取XML,但我所知道的任何软件在解析任何不转义的XML时都会抛出一个错误<和>不用作标记开始和结束的字符。它只是XML规范的一部分;这些字符被保留为结构的一部分。

    如果我是你,那么,我会用System.XML实用程序来分道扬镳,然后自己编写这个文件。任何像样的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>");
    }