加快C#紧凑框架中XML的解析(使用XmlTextReader和XElement)

本文关键字:使用 XmlTextReader XElement 框架 XML 加快 | 更新日期: 2023-09-27 18:30:51

我正在尝试导入大型XML文件(目标是100,000行)以将其导入SQL CE数据库文件(使用Compact Framework 3.5和SQL CE 3.5)。

最近我编写了一些代码来做到这一点,我使用XmlTextReader和XElement来解析我的XML输入文件,然后使用SqlCeCommand.TaableDirect/SqlCeResultSet/Insert将其写入数据库文件。(完整代码如下)...

目前,我

正在使用~25,000行文件进行测试,并且我的性能在解析输入XML文件的每一行时遇到瓶颈。

xElem = XElement.Parse(xmlTextReader.ReadOuterXml());

正在模拟器上执行一些运行...事实证明,运行一个完整的代码需要 93 秒,在 while 循环中运行空的 if 语句(所有内容都被注释掉)需要 14 秒,而在同一 if 语句中仅运行 XElement.Parse 需要 60 秒。因此,XElement.Parse 大约需要运行整个代码的一半(46 秒对 93 秒)。在真实设备(不是模拟器)上也观察到了相同的情况。

我能做些什么来加快速度?xmlTextReader.ReadOuterXml() 包括以下内容:<item><Index>121fg12e<Index><Name>John</Name>.........<Notes>John's profile</Notes></item>(我基本上只想提取标签中的值)。

以下是我的完整代码:

XmlTextReader xmlTextReader = new XmlTextReader(modFunctions.InFName);
XElement xElem = new XElement("item");
using (SqlCeConnection cn = new SqlCeConnection(connectionString))
{
    if (cn.State == ConnectionState.Closed)
        cn.Open();
    using (SqlCeCommand cmd = new SqlCeCommand())
    {
        cmd.Connection = cn;
        cmd.CommandText = "item";
        cmd.CommandType = CommandType.TableDirect;
        using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable))
        {
            SqlCeUpdatableRecord record = rs.CreateRecord();
            while (xmlTextReader.Read())
            {
                if (xmlTextReader.NodeType == XmlNodeType.Element &&
                    xmlTextReader.LocalName == "item" &&
                    xmlTextReader.IsStartElement() == true)
                {
                    xElem = XElement.Parse(xmlTextReader.ReadOuterXml());
                    values[0] = (string)xDoc.Root.Element("Index"); // 0
                    values[1] = (string)xDoc.Root.Element("Name"); // 1
                    ~~~
                    values[13] = (string)xDoc.Root.Element("Notes"); // 13
                    for (int i = 0; i < values.Length; i++)
                    {
                        if(!string.IsNullOrEmpty(values[i]))
                            record.SetValue(i, values[i]); // 0
                    }
                    rs.Insert(record);
                }
            }
        }
    }
}

加快C#紧凑框架中XML的解析(使用XmlTextReader和XElement)

您不必要地将 XML 转换为字符串,然后再转换回来。

改为致电XElement.FromReader(xmlTextReader)