我正在尝试导入大型 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);
}
}
}
}
}