加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将(大)XML写入C#中的文件?

发布时间:2020-12-16 07:55:22 所属栏目:百科 来源:网络整理
导读:伙计们, 请问,在C#.NET 3.5中编写真正大型XML文档(高达500 MB)的好方法是什么?我有一些搜索,似乎找不到任何解决这个具体问题的东西. 我以前的线程(What is the best way to parse (big) XML in C# Code?)涵盖了读取类似幅度的Xml文档…解决了这一点,我需要
伙计们,

请问,在C#.NET 3.5中编写真正大型XML文档(高达500 MB)的好方法是什么?我有一些搜索,似乎找不到任何解决这个具体问题的东西.

我以前的线程(What is the best way to parse (big) XML in C# Code?)涵盖了读取类似幅度的Xml文档…解决了这一点,我需要考虑如何将更新的功能(http://www.opengeospatial.org/standards/sfa)写入“update.xml”文档.

我的想法:显然,一个大的DOM是出来的,考虑到要生成的文档的最大大小.我正在使用XSD.EXE从架构中生成绑定类,它可以很好地与XmlSerializer类配合使用,但我认为它构建了一个DOM“底层”.它是否正确?.我一次不能拥有内存中的所有功能(高达50,000个).我需要从数据库读取功能,将其序列化,并将其写入文件.所以我想我应该使用XmlSerializer为文件中的每个功能写一个“doclet”.如果这甚至是可行的或者可行的话,我还不清楚.

你怎么看?

背景:我将一个旧的VB6 MapInfo“客户端插件”移植到C#.有一个现有的J2EE“更新服务”(实际上只是一个网络应用程序),这个程序(以及其他)必须与之配合使用.我无法更改服务器;除非绝对必要;特别是涉及改变其他客户.服务器接受一个不具体使用任何命名空间的模式的XML文档…即:只有默认的命名空间,并且其中的所有内容都在其中.

我的经验:我几乎是一个C#和.NET新手.我已经编程了大约10年的各种语言,包括Java,VB,C和一些C.

欢呼所有基思.

PS:这是晚餐时间,所以我会做大约半个小时的AWOL.

为了写大xml,XmlWriter(直接)是你的朋友 – 但是使用起来更难.另一个选择是使用DOM / object-model方法并组合它们,如果您占用了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 };
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读