我有以下功能:
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;
}
}
我该怎么办?
答案 0 :(得分:2)
如果您遇到性能问题,我建议XmlReader,因为它允许您解析XML,而不是预先解析它并创建您要使用的内存中对象模型无论如何必须再次通过。但是,它可能需要对代码进行一些重构,因为它会为您提供顺序(而非随机)访问。如果您不需要随机访问,那么这是一个不错的选择。
答案 1 :(得分:1)
我们发现XmlDocument缓慢,但仅仅是因为我们正在超越其设计范围。然而,为每个表行实例化一个会导致大量问题。它是一个专为就地操作而设计的重量级 - 它非常擅长 - 而且如果你创造和摧毁它们的速度超过人类可以计算的速度,你就会过度使用它。
答案 2 :(得分:1)
我遇到过您可能会遇到的性能问题。有一个foreach循环使用XmlDocument从文件中读取xml。 XmlDocument在循环外实例化。在处理了30万个文件之后,性能不断下降并逐步降低。将XmlDocument实例化放在循环内解决了这个问题。我永远不会期待这种行为,但我已经测量了它并亲眼看到它。
请注意,您必须测试自己的案例。考虑:
我建议重写代码以使用XmlReader,因为XmlDocument用于操作。您可能不需要使用XmlDocument读取数百万行,然后处理0或只处理几个XmlDocuments。