实例化XmlDocument是否昂贵?
本文关键字:是否 XmlDocument 实例化 | 更新日期: 2023-09-27 18:10:09
我有以下功能:
public static XmlNode GetXMLNodeFromString(string strXML)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXML);
return doc.DocumentElement;
}
可以在数据库调用返回的一行代码中被调用一百万次:
while (reader.Read())
{
myXMLList.Add(GetXMLNodeFromString((string)reader["GMLString"]));
}
有一个更好的方法比保持实例化xmlDocument的每一行?或者这样做是可以的吗?
I don't want to this:
XmlDocument doc = new XmlDocument();
while (reader.Read())
{
myXMLList.Add(doc, GetXMLNodeFromString((string)reader["GMLString"]));
}
因为在现实中有一个函数树我必须把它加进去。不只是GetXMLNodeFromString。
我可以这样做吗?
public static class Common
{
public static XmlDocument doc = new XmlDocument();
public static XmlNode GetXMLNodeFromString(string strXML)
{
doc.LoadXml(strXML);
return doc.DocumentElement;
}
}
我该怎么办?
如果您遇到性能问题,我推荐使用XmlReader,因为它允许您在XML传入时解析它,而不是预先解析它并创建内存中的对象模型,这样无论如何您都必须再次返回。但是,它可能需要稍微调整一下代码,因为它提供了顺序(而不是随机)访问。如果您不需要随机访问,这是一个不错的选择。
我们发现XmlDocument很慢,但这只是因为我们使它超出了它的设计范围。然而,为每个表行实例化一个将导致大量问题。它是为就地操作而设计的重量级类——它非常擅长就地操作——如果你创建和销毁它们的速度比一个人数数的速度还快,那你就是过度工作了。
我遇到了您可能遇到的性能问题。有一个foreach循环,使用XmlDocument从文件中读取xml。XmlDocument在循环外实例化。在处理了30万个文件之后,性能不断地逐渐下降。将XmlDocument实例化放入循环中解决了这个问题。我从来没有预料到这种行为,但我已经测量过了,亲眼看到了。
请注意,你必须测试你自己的情况。考虑:
- 行为可能取决于xml结构 你可以使用XmlReader我写的经验是在。net 2.0
我建议重写代码以使用XmlReader,因为XmlDocument是用于操作的。您可能不需要使用XmlDocument读取数百万行,然后处理0或几个XmlDocument。