在C#中生成XML时,将它生成为字符串时出现问题吗?在过去,我发现以编程方式生成XML非常繁琐和复杂。通过字符串连接/一个字符串生成器来创建xml看起来要容易得多,但是,这感觉像是不好的做法。
我应该生成一个字符串的XML吗?我应该生成XML作为C#中的字符串?
回答
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 2009-08-14 15:04:27
@Downvoter:小心点评为什么? – 2010-03-19 10:36:18
创建通过字符串连接的XML肯定是不好的做法。 XmlDomDocument不是非常详细或复杂的;我一直觉得它很容易(和安全)合作。
不,你不应该。 .NET(以及其他平台)中的XML库确保您创建有效的XML,并为您节省大量时间来解析它。另外,如果其他人需要使用您的XML并抱怨这是不正确的,那么您可以排除实际的XML本身,并且会为您节省很多时间来检查您是否正确连接。
你试过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);
使用XmlTextWriter,可以将结果放入StringBuilder中并使用结果字符串。另外,使用XmlTextWriter,您可以将内容放入流中。所以,如果您正在寻找灵活性,请使用XmlTextWriter。
如果你的问题是关于通过字符串连接构造一个xml文件,不要这样做。如果您打算将xml文档放在一起而没有任何其他帮助,请使用StringBuilder。
我会避免通过“连接”手动创建xml。您在生成的xml中增加了错误的可能性。微软的xml创建类已经过相当彻底的测试。使用它你的优势。
当你生成xml时,我会在大多数情况下推荐以下方法。
- 创建XSD为XML
- 编译XSD为对象
- 填充你的对象
- 反序列化的对象到XML
了好处到这样做在刚刚创建xml使用XMLDocuments 1.它很好地定义了一个XSD。其他开发人员知道他们收到的xml是什么(或他们正在修改什么) 2.易于在将来进行更改。 3.在xml文档中出现错字错误的可能性要小得多。
让我知道你是否需要任何代码示例或额外的帮助来执行此操作。
注意:我们在构建时从xsds生成cs文件,以确保有人不会手动修改生成的代码。
你的意思是序列化成XML,对吧? – 2009-08-14 14:59:56
在很多情况下,这是一个非常好的方法。 – 2009-08-14 15:02:03
是的,但他写了反序列化。 – 2009-08-14 15:21:54
在考虑使用字符串连接而不是合适的库生成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便于理解:当你正确格式化你的代码
我也推荐http://hsivonen.iki.fi/producing-xml/写XML时出现问题列表的摘要... – 2009-08-14 20:14:15
+1实际上给出了为什么通过字符串连接来实现它是一个坏主意的原因 – 2009-08-18 22:11:27
的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();
}
字符串连接是罚款,直到第一次的属性值中包含& – AakashM 2009-08-14 14:57:32
字符串连接是罚款,直到第一次什么有什么,你没有考虑。 – 2009-08-14 14:59:10
感谢您的所有答案。 – macleojw 2009-08-14 15:01:30