2011-09-28 49 views
3

我有以下功能:是否实例化XmlDocument昂贵?

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?或者这样做可以吗?

我不想这样:

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; 
    } 
} 

我应该怎么办?

+1

你或许应该停止使用*静态*这么多。创建你自己的类,在构造函数中创建XmlDocument,所以你只做一次。 –

回答

2

如果您遇到性能问题,我建议您使用XmlReader,因为它允许您在解析XML时进行解析,而不是预解析它,并创建您将要使用的内存中对象模型无论如何,我们再次回归。然而,它可能需要重构你的代码,因为它可以让你顺序(而不是随机)访问。如果你不需要随机访问,这是一个不错的选择。

+0

所有我发现从使用的XMLReader字符串生成XMLElements或节点的示例需要使用反正实例化一个如下的。你有一个例子吗? – capdragon

+0

@capdragon的想法是,你根本不会实例化一个XmlElement或XmlNode,而是直接从流中读取你需要的XML数据,自己调整格式和顺序。这不太方便,但它的运行速度要比通过XmlDocument创建完全分析的对象模型快得多。如果您遇到性能问题,我只会走这条路。 –

+0

我明白了。那么我没有性能问题,因为我现在只处理几千个。但我的观点预计将增长到超过一百万。我想我会通过桥梁。我想我应该更清楚一点:这是返回XML/GML的WCF服务的一部分。所以我正在检索GML并将其提供给客户。我不需要做任何阅读,格式化或订购。 – capdragon

1

我们发现XmlDocument的低迷,但只是因为我们颠簸它超出了其设计的范围。为每个表行实例化一个会导致大量问题。这是一个重量级的类设计用于就地操作 - 它是很好的 - 如果你正在创建和销毁它们比人类更快可以在他们的头数,你是劳累过度了。

1

我曾经历过的性能问题,你可能会进入。有foreach循环使用XmlDocument从文件读取xml。 XmlDocument在循环之外被实例化。处理30万个文件后,性能不断下降,并且逐渐恶化。将XmlDocument实例化放在循环内解决了这个问题。我永远不会期待这种行为,但我已经测量了它并亲眼看到了它。

请注意,你要测试自己的情况。试想一下:

  • 这种行为可能依赖于XML结构
  • 也许你可以使用的XmlReader
  • 的经验,我写了一篇关于是在.NET 2.0

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