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