使用C#解析XML文件?

我是XML和C#的新手; 我正在尝试找到一种方法来有效地解析给定的xml文件以检索相关的数值,基于“proj_title”值= heat_run或任何其他可能的值。 例如,计算特定测试运行的持续时间(proj_end val-proj_start val)。

ex.xml:  heat_run 100 200  

…我们无法按项目ID进行搜索,因为此值不会从测试运行到测试运行。 上面的文件很大:~8mb,并且有〜2000个标签,名称为proj_title。 有没有一种有效的方法来首先找到所有标签名称w / proj_title =“heat_run”,然后使用C#检索这个特定proj_title的proj开始和结束值?

这是我目前的C#代码:

 public class parser { public static void Main() { XmlDocument xmlDoc= new XmlDocument(); xmlDoc.Load("ex.xml"); //~2000 tags w/ proj_title //any more efficient way to just look for proj_title="heat_run" specifically? XmlNodeList heat_run_nodes=xmlDoc.GetElementsByTagName("proj_title"); } } 

您可以使用XPath查找匹配的所有节点,例如:

XmlNodeList matches = xmlDoc.SelectNodes("proj[proj_title='heat_run']")

matches将包含与critera匹配的所有proj节点。 了解有关XPath的更多信息: http : //www.w3schools.com/xsl/xpath_syntax.asp

SelectNodes上的MSDN文档

根据现代标准,8MB确实不是很大。 我个人使用LINQ to XML:

 XDocument doc = XDocument.Load("ex.xml"); var projects = doc.Descendants("proj_title") .Where(x => (string) x == "heat_run") .Select(x => x.Parent) // Just for simplicity .Select(x => new { Start = (int) x.Element("proj_start"), End = (int) x.Element("proj_end") }); foreach (var project in projects) { Console.WriteLine("Start: {0}; End: {1}", project.Start, project.End); } 

(显然可以根据自己的要求进行调整 – 根据问题,你需要做什么并不是很清楚。)

替代查询:

 var projects = doc.Descendants("proj") .Where(x => (string) x.Element("proj_title") == "heat_run") .Select(x => new { Start = (int) x.Element("proj_start"), End = (int) x.Element("proj_end") }); 

使用XDocument并使用LINQ api。 http://msdn.microsoft.com/en-us/library/bb387098.aspx

如果在尝试之后性能不是您所期望的,那么您必须寻找一个sax解析器。 Sax解析器不会将整个文档加载到内存中,并尝试在内存中的所有内容上应用xpath表达式。 它在事件驱动的方法中工作得更多,在某些情况下,这可以更快,并且不会使用尽可能多的内存。

那里可能有针对.NET的sax解析器,我没有自己使用它们用于.NET,但我为C ++做过。