Mar*_*ell 503
这取决于场景.XmlSerializer肯定是一种方式,并具有直接映射到对象模型的优势.在.NET 3.5中XDocument,等等也非常友好.如果尺寸非常大,那么XmlWriter就是你的朋友.
对于一个XDocument例子:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
Run Code Online (Sandbox Code Playgroud)
或者相同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);
Run Code Online (Sandbox Code Playgroud)
如果您正在编写大量数据流,那么任何DOM方法(例如XmlDocument/ XDocument等)都会很快占用大量内存.因此,如果您从CSV编写100 MB的XML文件,您可能会考虑XmlWriter; 这是更原始的(一次写入firehose),但非常有效(想象一下这里有一个大循环):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Run Code Online (Sandbox Code Playgroud)
最后,通过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);
Run Code Online (Sandbox Code Playgroud)
这是一个很好的模型,用于映射到类等; 但是,如果您正在做一些简单的事情(或者如果所需的XML与对象模型没有直接关联),则可能会有些过分.另一个问题XmlSerializer是它不喜欢序列化不可变类型:一切都必须有一个公共的getter 和 setter(除非你自己通过实现自己完成IXmlSerializable,在这种情况下,你没有通过使用获得太多XmlSerializer).
小智 59
我尝试过的最好的事情是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>
Run Code Online (Sandbox Code Playgroud)
然后你就可以像这样简单地构建XML:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
Run Code Online (Sandbox Code Playgroud)
或者只是从文件中加载XML,如下所示:
RootElement rootElement = RootElement.Load(filePath);
Run Code Online (Sandbox Code Playgroud)
或者像这样保存:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
Run Code Online (Sandbox Code Playgroud)
rootElement.Untyped 也以XElement的形式产生元素(从LINQ到XML).
小智 23
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)
)
);
Run Code Online (Sandbox Code Playgroud)
XmlWriter是编写优秀XML的最快方法.XDocument,XMLDocument和其他一些工作也很好,但是没有针对编写XML进行优化.如果您想尽快编写XML,那么绝对应该使用XmlWriter.
过去,我创建了 XML 架构,然后使用工具生成 C# 类,这些类将序列化到该架构。XML 模式定义工具就是一个示例
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
| 归档时间: |
|
| 查看次数: |
337754 次 |
| 最近记录: |