Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实例化XmlDocument是否昂贵?_C#_.net_Xml - Fatal编程技术网

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并将其提供给客户。我不需要做任何阅读,格式化或排序。