Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';使用字符串连接构建XML有什么不好?_C#_Xml_String - Fatal编程技术网

C# 什么';使用字符串连接构建XML有什么不好?

C# 什么';使用字符串连接构建XML有什么不好?,c#,xml,string,C#,Xml,String,在该线程中,将出现以下答案,其中包含大量的向上投票: 使用字符串连接构建XML的程序员。 我的问题是,为什么通过字符串连接(例如C#中的StringBuilder)构建XML不好 在过去我已经做过几次了,因为对于我正在处理的数据结构/对象来说,有时候这是从A点到B点最快的方法。到目前为止,我已经提出了一些理由,为什么这不是最好的方法,但是有什么我忽略了的吗?为什么要避免这种情况 可能我能想到的最大原因是您需要手动转义字符串,大多数新程序员(甚至一些有经验的程序员)都会忘记这一点。当他们测试它时,

在该线程中,将出现以下答案,其中包含大量的向上投票:

使用字符串连接构建XML的程序员。

我的问题是,为什么通过字符串连接(例如C#中的
StringBuilder
)构建XML不好

在过去我已经做过几次了,因为对于我正在处理的数据结构/对象来说,有时候这是从A点到B点最快的方法。到目前为止,我已经提出了一些理由,为什么这不是最好的方法,但是有什么我忽略了的吗?为什么要避免这种情况

  • 可能我能想到的最大原因是您需要手动转义字符串,大多数新程序员(甚至一些有经验的程序员)都会忘记这一点。当他们测试它时,它将对他们非常有用,但是当有人在他们输入的某处抛出&符号时,他们的应用程序将“随机”失败。好的,我会买这个,但是它很容易防止这个问题(举个例子)
  • 当我这样做时,我通常省略XML声明(即
    )。这有害吗
  • 绩效处罚?如果您坚持正确的字符串连接(即
    StringBuilder
    ),这有什么值得关注的吗?大概像
    XmlWriter
    这样的类也需要做一些字符串操作
  • 有更优雅的方法生成XML,例如使用
    XmlSerializer
    自动序列化/反序列化类。好的,我同意。C#有很多有用的类来实现这一点,但有时我不想为一些真正快速的事情创建一个类,比如写日志文件之类的。这只是我的懒惰吗?如果我正在做一些“真实的”事情,这是我处理w/XML的首选方法

  • 我认为问题在于,您没有将xml文件视为逻辑数据存储对象,而是将其视为一个简单的文本文件,您可以在其中编写字符串


    很明显,这些库为您执行字符串操作,但是读/写xml应该类似于将数据保存到数据库中,或者类似于逻辑的东西如果您需要简单的xml,那么就可以了。当xml变得更大或更复杂时,字符串连接的可维护性就会崩溃。您可以在开发或维护时付款。选择永远是你的-但历史表明,维护总是更昂贵,因此任何使其更容易的事情通常都是值得的

    您可能最终得到无效的XML,但在再次解析它之前,您无法找到它,而现在为时已晚。我通过艰苦的学习了解到了这一点。

    正如您所说,使用字符串连接来构建正确的XML是很尴尬的,尤其是现在您有了XML linq,它允许简单地构造XML图,并将获得正确的名称空间等

    显然,上下文和它的使用方式很重要,例如在日志示例string.Format中可以完全接受


    但是,人们在处理复杂的XML图形时往往忽略这些替代方案,而只是使用StringBuilder

    您需要手动转义字符串。这是正确的。但就这些吗?当然,在构建XML字符串时,您可以将XML规范放在桌面上,并在每次考虑所有可能的情况时都仔细检查。或者您可以使用一个封装了这些知识的库…

    我一直发现创建XML比阅读XML更麻烦。我从来没有掌握过序列化的诀窍——它似乎对我的类从来都不起作用——我不用花一个星期的时间来试着让它起作用,我可以在很短的时间内使用字符串创建一个XML文件并将其写出

    然后我使用XMLReader树加载它。如果XML文件读起来不是有效的,我会返回并在保存例程中找到问题并更正它。但在我得到一个工作的保存/加载系统之前,我拒绝执行任务关键型工作,直到我知道我的工具是可靠的

    我想这取决于程序员的偏好。当然,确实有不同的方法做事情,但是对于开发/测试/研究/调试来说,这很好。然而,我也会清理我的代码,并在将其交给另一个程序员之前对其进行注释


    因为不管您使用的是StringBuilder还是XMLNodes来保存/读取文件,如果文件乱七八糟,没有人会理解它是如何工作的。

    我认为可读性、灵活性和可伸缩性是重要因素。考虑下面的一个LINQ to XML:

    XDocument doc = new XDocument(new XDeclaration("1.0","UTF-8","yes"),
       new XElement("products", from p in collection
        select new XElement("product",
            new XAttribute("guid", p.ProductId), 
            new XAttribute("title", p.Title),
            new XAttribute("version", p.Version))));
    

    你能找到比这更简单的方法吗?我可以将它输出到浏览器,保存到文档,在几秒钟内添加属性/元素等等。。。只需添加几行代码。我几乎可以用它做任何事情,而不用花很多力气。

    反对使用字符串连接的另一点是,读取代码时,数据的层次结构不清楚。例如,在@Sander的Linq to XML示例中,“product”元素所属的父元素、“title”属性所应用的元素等都很清楚。

    实际上,我发现字符串连接的最大问题不是第一次就正确,而是在代码维护期间保持正确。通常,使用字符串concat编写的一段完美的XML会被更新以满足新的需求,而字符串concat代码太脆弱了

    只要备选方案是XML序列化和
    XmlDocument
    ,我就可以看到支持字符串concat的简单性参数。然而,自从
    XDocument
    等人以来,再也没有理由使用字符串concat来构建XML了。有关编写XML的最佳方法,请参见Sander的答案

    XDocument
    的另一个好处是XML实际上是一个相当复杂的标准,大多数程序员根本不理解XML