我如何在C#中构建XML?
如何在C#中生成有效的XML?
这取决于场景。 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写入100 MB 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
获得很多)。
我已经尝试过的最好的事情是LINQ to XSD(这对大多数开发人员来说是未知的)。 你给它一个XSD Schema,它会在后台为你生成一个完美映射的完整强类型对象模型(基于LINQ to 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.Untyped
还会生成XElement形式的元素(从LINQ到XML)。
new XElement("Foo",
from s in nameValuePairList
select
new XElement("Bar",
new XAttribute("SomeAttr", "SomeAttrValue"),
new XElement("Name", s.Name),
new XElement("Value", s.Value)
)
);
链接地址: http://www.djcxy.com/p/29917.html
上一篇: How can I build XML in C#?
下一篇: Text editor to open big (giant, huge, large) text files