实例化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;
    }
}

我该怎么办?

实例化XmlDocument是否昂贵?

如果您遇到性能问题,我推荐使用XmlReader,因为它允许您在XML传入时解析它,而不是预先解析它并创建内存中的对象模型,这样无论如何您都必须再次返回。但是,它可能需要稍微调整一下代码,因为它提供了顺序(而不是随机)访问。如果您不需要随机访问,这是一个不错的选择。

我们发现XmlDocument很慢,但这只是因为我们使它超出了它的设计范围。然而,为每个表行实例化一个将导致大量问题。它是为就地操作而设计的重量级类——它非常擅长就地操作——如果你创建和销毁它们的速度比一个人数数的速度还快,那你就是过度工作了。

我遇到了您可能遇到的性能问题。有一个foreach循环,使用XmlDocument从文件中读取xml。XmlDocument在循环外实例化。在处理了30万个文件之后,性能不断地逐渐下降。将XmlDocument实例化放入循环中解决了这个问题。我从来没有预料到这种行为,但我已经测量过了,亲眼看到了。

请注意,你必须测试你自己的情况。考虑:

  • 行为可能取决于xml结构
  • 你可以使用XmlReader我写的经验是在。net 2.0

我建议重写代码以使用XmlReader,因为XmlDocument是用于操作的。您可能不需要使用XmlDocument读取数百万行,然后处理0或几个XmlDocument。