我应该在C#中将XML生成为字符串吗?

11

在使用C#生成XML时,将其生成为字符串是否存在问题?过去我发现通过编程方式生成XML非常冗长和复杂。通过字符串拼接/字符串构建器创建XML似乎更容易,但感觉这是一种不好的实践。
我应该将XML生成为字符串吗?


1
字符串连接一直都很好,除非第一次属性值包含 "&"。 - AakashM
字符串拼接很好,直到第一次出现你没有考虑到的任何内容。 - Robin Day
如果你尝试使用字符串拼接,很可能很快就会发现这种解决方案比起使用.NET BCL中的适当类来说要糟糕得多,因为它会有以下问题: a) 难以维护 b) 很容易出错(拼写错误、缺少括号、无效输出等) 花时间正确地做这件事,在未来会多次回报。 最可维护的解决方案将是丹(使用XSD和代码生成器)提供的解决方案。 - Piotr Owsiak
8个回答

13

XDocument、XElement和XAttribute类使得在C#中生成xml变得更加容易,比起使用XmlDocument或XmlWriter。

举例来说,要生成这个:

<RootElement>
    <ChildElement Attribute1="Hello" Attribute2="World" />
    <ChildElement Attribute1="Foo" Attribute2="Bar" />
</RootElement>

你可以这样做:

XDocument xDocument = new XDocument(
    new XElement("RootElement",
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Hello"),
            new XAttribute("Attribute2", "World")
        ),
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Foo"),
            new XAttribute("Attribute2", "Bar")
        )
    )
);

得试一下这个。谢谢! - macleojw

7

您尝试过使用Linq to Xml吗?它不是很冗长:

XElement xml = new XElement("contacts",
                    new XElement("contact", 
                        new XAttribute("id", "1"),
                        new XElement("firstName", "first"),
                        new XElement("lastName", "last")
                    ),
                    new XElement("contact", 
                        new XAttribute("id", "2"),
                        new XElement("firstName", "first2"),
                        new XElement("lastName", "last2")
                    )
                );
Console.Write(xml);

5
在考虑使用字符串拼接而不是适当的库来生成XML之前,请先阅读XML规范。特别注意字符集和字符引用等细节。
现在你可以去读了,我会等你的。
现在请问自己,你真的想要确保你的拼接字符串符合所有这些规则并编写所有辅助函数,还是想使用经过充分测试的库,其中所有这些逻辑都已为您封装?
很好。
很高兴这个问题得到解决。

我还推荐http://hsivonen.iki.fi/producing-xml/,以获得编写XML时需要注意的问题列表的概要... - Dominic Mitchell
+1 因为使用字符串拼接的方式实现此功能是不好的,而且需要给出具体原因。 - Simon Nickerson

3
在大多数生成XML的情况下,我建议采用以下方法:
  1. 为您的XML创建XSD
  2. 将XSD编译为对象
  3. 填充您的对象
  4. 将对象反序列化为XML
与使用XMLDocuments直接创建XML相比,这种方法的好处包括:
1. 使用XSD进行了良好定义。其他开发人员知道他们正在接收什么样的XML(或者他们正在修改什么); 2. 未来更改容易; 3. XML文档中的笔误错误几乎不可能出现。
如果需要代码示例或关于如何执行此操作的其他帮助,请告诉我。
请注意:我们在构建时从XSD生成C#文件,以确保没有人手动修改生成的代码。

是的,但他写了反序列化。 - Tamás Szelei
是的 - 我本意是序列化,但我没有注意到我写了什么。 - Dan

2

如果你正确格式化代码,XmlWriter并不那么糟糕:

StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();

    writer.WriteStartElement("root");

    writer.WriteStartElement("Node1");
    writer.WriteAttributeString("att1", "value");
    writer.WriteEndElement();

    writer.WriteStartElement("Node2");
    writer.WriteString("inner text");
    writer.WriteEndElement();

    writer.WriteEndElement();

    writer.WriteEndDocument();
}

您可以在代码中添加缩进以便于理解。
using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();
    {
        writer.WriteStartElement("root");
        {
            writer.WriteStartElement("Node1");
            writer.WriteAttributeString("att1", "value");
            writer.WriteEndElement();

            writer.WriteStartElement("Node2");
            writer.WriteString("inner text");
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
    writer.WriteEndDocument();
}

2
通过字符串拼接创建XML绝对是不好的实践。XmlDomDocument并不是非常冗长或混乱; 我一直觉得它非常容易(而且安全)使用。

2

不,你不应该这么做。.NET(和其他平台)中的XML库确保您创建有效的XML,并节省了大量时间来担心如何解析它。此外,如果其他人需要使用您的XML并抱怨它不正确,您可以排除实际的XML本身,并节省大量时间检查您是否正确地进行了连接。


1

使用XmlTextWriter,您可以将结果放入StringBuilder中并使用生成的字符串。此外,使用XmlTextWriter,您还可以将内容放入流中。因此,如果您需要灵活性,请使用XmlTextWriter。

如果您的问题是关于通过字符串连接构建xml文件,请不要这样做。如果您要组合一个xml文档而没有其他帮助,请使用StringBuilder。

我会避免手动创建xml通过“连接”。这会增加生成的xml中出现错误的可能性。Microsoft的xml创建类已经经过了相当彻底的测试。利用它来获得优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接