C# 在XML文件中查找节点-C中的性能改进

C# 在XML文件中查找节点-C中的性能改进,c#,xml,performance,C#,Xml,Performance,假设我需要使用C在XML文件中查找特定节点 <node attribute="my-target-attribute"> 我的目标属性是运行时的变量输入 节点在XML文件中没有特定的位置,我基本上只需要扫描整个XML层次结构,直到找到具有匹配属性的节点 是否有任何方法可以预处理XML以便更快地查找节点?我需要保留原始的XML结构。XML文件可能有10000个节点。您可以使用xslt转换XML,使节点处于已知深度。然后,当您使用XPath进行选择时,您可以相应地进行选择,而无需使用/

假设我需要使用C在XML文件中查找特定节点

<node attribute="my-target-attribute">
我的目标属性是运行时的变量输入

节点在XML文件中没有特定的位置,我基本上只需要扫描整个XML层次结构,直到找到具有匹配属性的节点


是否有任何方法可以预处理XML以便更快地查找节点?我需要保留原始的XML结构。XML文件可能有10000个节点。

您可以使用xslt转换XML,使节点处于已知深度。然后,当您使用XPath进行选择时,您可以相应地进行选择,而无需使用//运算符。

您可以使用xslt转换xml,使节点处于已知深度。然后,当您使用XPath进行选择时,您可以相应地进行选择,而无需使用//运算符。

使用VTD-XML,您可以将XML文档索引为VTD+XML, 这消除了解析的开销

使用VTD-XML,您可以将XML文档索引为VTD+XML, 这消除了解析的开销


您当然可以预处理XML以加快查找速度:

Dictionary<string, XmlElement> elementMap = new Dictionary<string, XmlElement>();
AddElementToMap(doc.DocumentElement, elementMap);
...
private void AddElementToMap(XmlElement elm, Dictionary<string, XmlElement> elementMap)
{
   elementMap[elm.GetAttribute("attribute")] = elm;
   foreach (XmlElement child in elm.SelectNodes("node"))
   {
      AddElementToMap(child, elementMap);
   }
}

该代码假定文档中的每个元素都是命名节点,每个元素都有一个名为attribute的属性,并且所有属性值都是唯一的。如果这些条件中的任何一个不真实,代码会更复杂,但也并非例外。

您当然可以预处理XML以加快查找速度:

Dictionary<string, XmlElement> elementMap = new Dictionary<string, XmlElement>();
AddElementToMap(doc.DocumentElement, elementMap);
...
private void AddElementToMap(XmlElement elm, Dictionary<string, XmlElement> elementMap)
{
   elementMap[elm.GetAttribute("attribute")] = elm;
   foreach (XmlElement child in elm.SelectNodes("node"))
   {
      AddElementToMap(child, elementMap);
   }
}

该代码假定文档中的每个元素都是命名节点,每个元素都有一个名为attribute的属性,并且所有属性值都是唯一的。如果这些条件中的任何一个都不真实,那么代码会更复杂,但也并非例外。

与另一个答案类似,您可以使用类似于selectNodes的xpath/[@attribute='my-target-attribute'].//将搜索所有级别深度的节点。

类似于另一个答案,您可以使用类似于selectNodes的xpath/[@attribute='my-target-attribute'].//将搜索所有级别深度的节点。

这里有两种截然不同的场景:一种是将XML加载到内存中一次,然后重复查找内存中的表示形式XmlDocument、XPathDocument、XDocument等。另一种是每次需要查找时都必须从文件中加载文档。哪一个是你的?我对任何一个都持开放态度。另一种选择可能是预处理文件并将其内容加载到数据库中。是否需要特别获取XML节点(例如,因为您将把它移交给其他XML处理API,如XslCompiledTransform或其中存储的一些数据)?如果是后者,什么样的数据只是一个字符串、一堆随机值、一棵节点树…?以下是步骤:1定位与目标属性匹配的节点。2递归地遍历节点的父节点,根据每个遍历节点的值构建字符串。3到达根目录时停止。。。。第二步和第三步没有问题,只是找到耗时的初始节点。这里有两种截然不同的场景:一种是将XML加载到内存中一次,然后重复查找内存中的表示形式XmlDocument、XPathDocument,XDocument等。另一个是每次需要查找时,都必须从文件中加载文档。哪一个是你的?我对任何一个都持开放态度。另一种选择可能是预处理文件并将其内容加载到数据库中。是否需要特别获取XML节点(例如,因为您将把它移交给其他XML处理API,如XslCompiledTransform或其中存储的一些数据)?如果是后者,什么样的数据只是一个字符串、一堆随机值、一棵节点树…?以下是步骤:1定位与目标属性匹配的节点。2递归地遍历节点的父节点,根据每个遍历节点的值构建字符串。3到达根目录时停止。。。。第二步和第三步没有问题,只是找到初始节点很耗时。这可能不适用于我的一个原因。。。我的节点都已命名。所以我的XPATH应该是:/node/node/node/node/[@attribute='my-target-attribute'],这是一个非常奇怪的xml结构这可能对我不起作用的一个原因。。。我的节点都已命名。所以我的XPATH应该是:/node/node/node/node/[@attribute='my-target-attribute'],这是一个非常奇怪的xml结构