是否有可能在运行中有效地将元素添加到XML文档中?

时间:2016-04-12 17:02:18

标签: c# xml

我的意思是,我正在尝试构建XML文件,因为正在从数据库中读取记录。在某种程度上,我猜你说我正在做DataSet.WriteToXML()的手动版本。但是我需要在数据流过时控制数据,因此手动编写记录。

我的问题是,无论我使用XDocument尝试做什么,无论有没有Streams,我发现我添加的元素只是堆积在内存中。即使我试图批量生产#34;记录并偶尔拨打XDocument.Save(),我仍然会在某个时候找到OutOfMemoryException

首先,我想知道有没有"读取记录,写一条记录" ......从DataTable.Row直接传递到XML节点/子节点(XML中的记录)。即使我怀疑任何"是"答案将来自它将涉及的所有I / O的主要性能损失。

我的最新迭代(列出的内容太多了):

XDocument xdoc = null;
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
using (var fs = new FileStream(tmpXml, FileMode.Open, FileAccess.ReadWrite))
    xdoc = XDocument.Load(XmlReader.Create(fs));
foreach (DataTable dt in ds.Tables)
{
    using (var reader = sql.ExecuteReader(String.Format(@"SELECT * FROM ""{0}""", dt.TableName)))
    {
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                var tableElement = new XElement(dt.TableName);
                xdoc.Root.Add(tableElement);
                foreach (DataColumn dc in dt.Columns)
                {
                    if (dt.TableName.EndsWith("_Option") && reader.GetOrdinal(dc.ColumnName) == 13)
                        tableElement.Add(new XElement(dc.ColumnName, ""));
                    else
                        tableElement.Add(new XElement(dc.ColumnName, reader[dc.ColumnName]));
                }
            }
        }
    }
}

所以基本的问题是,采用我读取的行的最有效方法是什么,并尽快将它们放入物理XML文件中,防止XDocument在内存中堆积数据?

编辑:我应该指出XML文件已经存在,只写了表模式。这里的目标是打开该文件,将实际数据记录写入其中并保存。

0 个答案:

没有答案