伙计们,
请问,在C#.NET 3.5中编写真正大的XML文档(最多500 MB)有什么好方法?我有一些搜索,似乎找不到任何解决这个具体问题的东西.
我之前的主题(在C#代码中解析(大)XML的最佳方法是什么?)包括读取类似大小的Xml文档...解决了这个问题后,我需要考虑如何编写更新的功能(http:// www. opengeospatial.org/standards/sfa)到"update.xml"文件.
我的想法:考虑到要生成的文档的最大大小,显然有一个大的DOM已经出局了.我正在使用XSD.EXE从模式中生成绑定类...它与XmlSerializer类很好地配合,但我认为它在"引擎盖下"构建了一个DOM.它是否正确?.我不能同时在内存中保存所有功能(最多50,000个).我需要从数据库中读取一个功能,序列化它,并将其写入文件.所以我想我应该使用XmlSerializer为文件的每个单独的功能编写"doclet".如果这是可能/可行的话,我还不知道.
你怎么看?
背景:我正在将旧的VB6 MapInfo"客户端插件"移植到C#.有一个现有的J2EE"更新服务"(实际上只是一个web-app),该程序(以及其他)必须使用它.我无法改变服务器; 除非有必要; 特别是涉及改变其他客户.服务器接受一个XML文档,其架构不具体说明任何名称空间......即:只有默认名称空间,一切都在其中.
我的经验:我几乎是一个C#和.NET新手.我用各种语言编写了大约10年的编程,包括Java,VB,C和一些C++.
干杯全都.基思.
PS:这是晚餐时间,所以我将大约半小时擅离职守.
Mar*_*ell 16
对于写大xml,XmlWriter(直接)是你的朋友 - 但它更难使用.另一种选择是使用DOM /对象模型方法并将它们组合起来,如果你掌握XmlWriterSettings并禁用xml标记,并且摆脱名称空间声明,这可能是可行的......
using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
public class Foo {
[XmlAttribute]
public int Id { get; set; }
public string Bar { get; set; }
}
static class Program {
[STAThread]
static void Main() {
using (XmlWriter xw = XmlWriter.Create("out.xml")) {
xw.WriteStartElement("xml");
XmlSerializer ser = new XmlSerializer(typeof(Foo));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
foreach (Foo foo in FooGenerator()) {
ser.Serialize(xw, foo, ns);
}
xw.WriteEndElement();
}
}
// streaming approach; only have the smallest amount of program
// data in memory at once - in this case, only a single `Foo` is
// ever in use at a time
static IEnumerable<Foo> FooGenerator() {
for (int i = 0; i < 40; i++) {
yield return new Foo { Id = i, Bar = "Foo " + i };
}
}
}
Run Code Online (Sandbox Code Playgroud)