Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#Compact框架中加速XML解析(使用XmlTextReader和XElement)?_C#_Xml_Xml Parsing_Sql Server Ce_Compact Framework - Fatal编程技术网

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

在C#Compact框架中加速XML解析(使用XmlTextReader和XElement)?,c#,xml,xml-parsing,sql-server-ce,compact-framework,C#,Xml,Xml Parsing,Sql Server Ce,Compact Framework,我正在尝试导入大型XML文件(目标是100000行)以将其导入SQL CE数据库文件(使用Compact Framework 3.5和SQL CE 3.5) 最近我编写了一些代码来实现这一点,我使用XElement的XmlTextReader来解析XML输入文件,然后使用SqlCeCommand.TaableDirect/SqlCeResultSet/Insert将其写入数据库文件。(请填写下面的代码) 目前,我正在使用25000行文件进行测试,在解析输入XML文件的每一行时,我的性能都会受到限

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

最近我编写了一些代码来实现这一点,我使用XElement的XmlTextReader来解析XML输入文件,然后使用SqlCeCommand.TaableDirect/SqlCeResultSet/Insert将其写入数据库文件。(请填写下面的代码)

目前,我正在使用25000行文件进行测试,在解析输入XML文件的每一行时,我的性能都会受到限制

xElem = XElement.Parse(xmlTextReader.ReadOuterXml());
正在emulator上执行一些运行。。。结果表明,运行一个完整的代码需要93秒,在while循环中运行空if语句(所有内容都被注释掉)需要14秒,在同一if语句中只运行XElement.Parse需要60秒。因此,XElement.Parse大约需要运行整个代码所需时间的一半(46秒对93秒)。在真实设备(不是模拟器)上也观察到了同样的情况

我能做些什么来加快速度?ReadOuterXml()由以下内容组成:
121fg12eJohn………John的个人资料
(我基本上只想提取标记中的值)

以下是我的完整代码:

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);
                }
            }
        }
    }
}
XmlTextReader XmlTextReader=新的XmlTextReader(modFunctions.InFName);
XElement xElem=新XElement(“项目”);
使用(SqlCeConnection cn=newsqlceconnection(connectionString))
{
if(cn.State==ConnectionState.Closed)
cn.Open();
使用(SqlCeCommand cmd=new SqlCeCommand())
{
cmd.Connection=cn;
cmd.CommandText=“项目”;
cmd.CommandType=CommandType.TableDirect;
使用(SqlCeResultSet rs=cmd.executesultset(resultstoptions.updateable))
{
SQLCEUpdateableRecord=rs.CreateRecord();
while(xmlTextReader.Read())
{
if(xmlTextReader.NodeType==XmlNodeType.Element&&
xmlTextReader.LocalName==“项”&&
xmlTextReader.IsStartElement()=真)
{
xElem=XElement.Parse(xmlTextReader.ReadOuterXml());
值[0]=(字符串)xDoc.Root.Element(“索引”);//0
值[1]=(字符串)xDoc.Root.Element(“名称”);//1
~~~
值[13]=(字符串)xDoc.Root.Element(“注释”);//13
for(int i=0;i
您不必要地将XML转换为字符串,然后再转换回来


调用
XElement.FromReader(xmlTextReader)

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


请致电
XElement.FromReader(xmlTextReader)

谢谢!这有帮助。它将它从60秒降到了25秒(在if语句中只运行这一行)。我必须把它从XNode投射到XElement。。。我不确定是否能以某种方式避免它:xElem=(XElement)XNode.ReadFrom(xmlTextReader);非常感谢。这有帮助。它将它从60秒降到了25秒(在if语句中只运行这一行)。我必须把它从XNode投射到XElement。。。我不确定是否能以某种方式避免它:xElem=(XElement)XNode.ReadFrom(xmlTextReader);欢迎来到堆栈溢出!仅供参考,您不应使用
new XmlTextReader()
new XmlTextWriter()
。自.NET 2.0以来,它们一直被弃用。改用
XmlReader.Create()
XmlWriter.Create()
。欢迎使用堆栈溢出!仅供参考,您不应使用
new XmlTextReader()
new XmlTextWriter()
。自.NET 2.0以来,它们一直被弃用。改用
XmlReader.Create()
XmlWriter.Create()