在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?

Posted

技术标签:

【中文标题】在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?【英文标题】:Speed up parsing of XML in C# Compact Framework (using XmlTextReader & XElement)? 【发布时间】:2013-09-09 16:55:01 【问题描述】:

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

【问题讨论】:

欢迎来到 Stack Overflow!仅供参考,您不应使用new XmlTextReader()new XmlTextWriter()。自 .NET 2.0 以来,它们已被弃用。请改用XmlReader.Create()XmlWriter.Create() 【参考方案1】:

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

请致电XElement.FromReader(xmlTextReader)

【讨论】:

谢谢!这有帮助。它把它从 60 秒缩短到 25 秒(在 if 语句中只运行这一行)。我确实不得不将它从 XNode 转换为 XElement...我不确定我是否可以以某种方式避免它:xElem = (XElement)XNode.ReadFrom(xmlTextReader);

以上是关于在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?的主要内容,如果未能解决你的问题,请参考以下文章

c# - 针对 Compact Net Framework 3.5 编译时出错 - 方法 'GetString' 没有重载采用 '1' 参数

如何使用 Compact Framework 加粗文本

Compact-Framework:最小化和恢复不起作用

Compact Framework 的 Zip 库选项?

Compact Framework 3.5 设置表单父级

在 .NET Compact Framework 中使用简单的 SOAP