如何在c#中生成有效的XML ?
当前回答
如上所述。
我使用stringbuilder.append()。
非常简单,然后可以使用xmldocument。加载(stringbuilder对象作为参数)。
你可能会发现自己在使用字符串。Concat,但这是一种非常直接的方法。
其他回答
这取决于场景。XmlSerializer当然是一种方法,它具有直接映射到对象模型的优点。在。net 3.5中,XDocument等也非常友好。如果大小非常大,那么XmlWriter是您的好朋友。
对于XDocument的例子:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
或者与XmlDocument相同:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
如果正在编写大量数据流,那么任何DOM方法(如XmlDocument/XDocument等)都将很快占用大量内存。因此,如果您正在从CSV编写一个100mb的XML文件,您可能会考虑XmlWriter;这是更原始的(一个写一次的消防水管),但非常有效(想象这里有一个大循环):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
最后,通过XmlSerializer:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
这是一个很好的映射到类等的模型;但是,如果您正在做一些简单的事情(或者所需的XML与对象模型并没有真正的直接关联),那么它可能就太过了。XmlSerializer的另一个问题是它不喜欢序列化不可变类型:所有东西都必须有一个公共getter和setter(除非您通过实现IXmlSerializable自己完成这一切,在这种情况下,使用XmlSerializer并没有获得多少好处)。
XmlWriter是编写良好XML的最快方法。XDocument, XMLDocument和其他一些也很好,但没有为编写XML进行优化。如果希望尽可能快地编写XML,那么肯定应该使用XmlWriter。
我尝试过的最好的方法是LINQ to XSD(大多数开发人员都不知道这一点)。您给它一个XSD Schema,它就会在后台为您生成一个完美映射的、完整的强类型对象模型(基于LINQ到XML),这非常容易操作——它实时更新和验证您的对象模型和XML。虽然它仍然是“预览”,我没有遇到任何错误与它。
如果你的XSD模式是这样的:
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1" type="xs:string" />
<xs:element name="Element2" type="xs:string" />
</xs:sequence>
<xs:attribute name="Attribute1" type="xs:integer" use="optional" />
<xs:attribute name="Attribute2" type="xs:boolean" use="required" />
</xs:complexType>
</xs:element>
然后你可以像这样简单地构建XML:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
或者像这样简单地从文件中加载XML:
RootElement rootElement = RootElement.Load(filePath);
或者这样保存:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
rootElement。un类型化也产生XElement形式的元素(从LINQ到XML)。
为了简单起见,我只使用System.XML中找到的XmlDocument/XmlNode/XmlAttribute类和XmlDocument DOM。
它为我生成XML,我只需要链接几个项目在一起。
但是,对于较大的内容,我使用XML序列化。
在过去,我创建了我的XML模式,然后使用工具生成c#类,这些类将序列化到该模式。XML模式定义工具就是一个例子
http://msdn.microsoft.com/en-us/library/x6c1kb0s (VS.71) . aspx
推荐文章
- 新建T()
- 如何将枚举绑定到WPF中的组合框控件?
- 拒绝访问该路径
- Visual Studio - Resx文件默认“内部”为“公共”
- 使用python创建一个简单的XML文件
- 使用linq转换列表到字典,不用担心重复
- 单元测试:日期时间。现在
- 什么是回调?
- 返回匿名类型的结果?
- 何时使用IList,何时使用List
- ConfigurationManager。AppSettings在.NET Core 2.0中可用?
- 在c#的控制台应用程序中使用'async
- 在单元测试中设置HttpContext.Current.Session
- 如何开始开发Internet Explorer扩展?
- 更新行,如果它存在,否则插入逻辑实体框架