C# 实例化XmlDocument是否昂贵?
我有以下功能:C# 实例化XmlDocument是否昂贵?,c#,.net,xml,C#,.net,Xml,我有以下功能: public static XmlNode GetXMLNodeFromString(string strXML) { XmlDocument doc = new XmlDocument(); doc.LoadXml(strXML); return doc.DocumentElement; } 在数据库调用返回的一行代码中可以调用一百万次: while (reader.Read()) { myXMLList.Add(GetXMLNodeFromS
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;
}
}
我该怎么办?如果您遇到性能问题,我建议您这样做,因为它允许您在XML输入时解析XML,而不是预先解析它并创建内存中的对象模型,您无论如何都必须重新进行。然而,它可能需要重新构造代码,因为它提供了顺序(而不是随机)访问。如果您不需要随机访问,那么它是一个不错的选择。我们发现XmlDocument很慢,但这仅仅是因为我们对它的攻击超出了它的设计范围。然而,为每个表行实例化一个会给您带来大量问题。这是一门为就地操纵设计的重量级课程,它非常擅长于就地操纵。如果你创造和摧毁它们的速度超过了人类在大脑中的计算速度,那么你就是在过度工作。我遇到过性能问题,你可能会陷入其中。有一个foreach循环使用XmlDocument从文件中读取xml。XmlDocument在循环外部实例化。在处理了30万个文件后,性能不断下降。将XmlDocument实例化放在循环中解决了这个问题。我从来没有想过会有这种行为,但我已经测量过了,并且亲眼看到了 请注意,您必须测试您自己的案例。考虑:
- 这种行为可能取决于xml结构
- 也许您可以使用XmlReader
- 我写的经验是在.NET2.0上
我建议重写您的代码以使用XmlReader,因为XmlDocument用于操作。您可能不需要用XmlDocument读取数以百万计的行,然后处理0个或几个XmlDocuments。您可能应该停止使用静态文件。创建您自己的类,在构造函数中创建XmlDocument,这样您只需执行一次。我发现的所有使用XMLReader从字符串创建XMLElements或节点的示例都需要实例化XmlDocument。你有没有一个例子?@capdragon的想法是,你根本不会实例化一个XmlElement或XmlNode,而是直接从流中读取你需要的XML数据,自己协调格式和顺序。这不太方便,但比通过XmlDocument创建完全解析的对象模型要快得多。如果你有性能问题,我只会走这条路。我明白了。我没有性能问题,因为我现在只处理几千个问题。但我的观点预计会超过一百万。我想那时我会过桥的。我想我应该说得更清楚一些:这是返回XML/GML的WCF服务的一部分。因此,我正在检索GML并将其提供给客户。我不需要做任何阅读,格式化或排序。