2009-08-14 59 views
11

在C#中生成XML时,将它生成为字符串时出现问题吗?在过去,我发现以编程方式生成XML非常繁琐和复杂。通过字符串连接/一个字符串生成器来创建xml看起来要容易得多,但是,这感觉像是不好的做法。
我应该生成一个字符串的XML吗?我应该生成XML作为C#中的字符串?

+1

字符串连接是罚款,直到第一次的属性值中包含& – AakashM 2009-08-14 14:57:32

+0

字符串连接是罚款,直到第一次什么有什么,你没有考虑。 – 2009-08-14 14:59:10

+0

感谢您的所有答案。 – macleojw 2009-08-14 15:01:30

回答

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") 
     ) 
    ) 
); 
+0

将不得不尝试这一点。谢谢! – macleojw 2009-08-14 15:04:27

+0

@Downvoter:小心点评为什么? – 2010-03-19 10:36:18

2

创建通过字符串连接的XML肯定是不好的做法。 XmlDomDocument不是非常详细或复杂的;我一直觉得它很容易(和安全)合作。

2

不,你不应该。 .NET(以及其他平台)中的XML库确保您创建有效的XML,并为您节省大量时间来解析它。另外,如果其他人需要使用您的XML并抱怨这是不正确的,那么您可以排除实际的XML本身,并且会为您节省很多时间来检查您是否正确连接。

7

你试过Linq到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); 
1

使用XmlTextWriter,可以将结果放入StringBuilder中并使用结果字符串。另外,使用XmlTextWriter,您可以将内容放入流中。所以,如果您正在寻找灵活性,请使用XmlTextWriter。

如果你的问题是关于通过字符串连接构造一个xml文件,不要这样做。如果您打算将xml文档放在一起而没有任何其他帮助,请使用StringBuilder。

我会避免通过“连接”手动创建xml。您在生成的xml中增加了错误的可能性。微软的xml创建类已经过相当彻底的测试。使用它你的优势。

3

当你生成xml时,我会在大多数情况下推荐以下方法。

  1. 创建XSD为XML
  2. 编译XSD为对象
  3. 填充你的对象
  4. 反序列化的对象到XML

了好处到这样做在刚刚创建xml使用XMLDocuments 1.它很好地定义了一个XSD。其他开发人员知道他们收到的xml是什么(或他们正在修改什么) 2.易于在将来进行更改。 3.在xml文档中出现错字错误的可能性要小得多。

让我知道你是否需要任何代码示例或额外的帮助来执行此操作。

注意:我们在构建时从xsds生成cs文件,以确保有人不会手动修改生成的代码。

+0

你的意思是序列化成XML,对吧? – 2009-08-14 14:59:56

+0

在很多情况下,这是一个非常好的方法。 – 2009-08-14 15:02:03

+0

是的,但他写了反序列化。 – 2009-08-14 15:21:54

5

在考虑使用字符串连接而不是合适的库生成XML之前,请阅读XML specification。特别注意诸如字符集和字符引用等细节。

你现在就可以做到。我会等。

现在问你自己 - 你真的想确保你的连接字符串是有效的,根据所有这些规则并自己编写所有的帮助函数,或者你想使用一个经过良好测试的库,其中所有的逻辑为你封装?

好。

很高兴已分类。

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(); 
} 

你也可以在你的代码添加identation便于理解:当你正确格式化你的代码

+0

我也推荐http://hsivonen.iki.fi/producing-xml/写XML时出现问题列表的摘要... – 2009-08-14 20:14:15

+0

+1实际上给出了为什么通过字符串连接来实现它是一个坏主意的原因 – 2009-08-18 22:11:27

2

的XmlWriter并不坏。

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(); 
}