从XML中提取一小部分数据

Joh*_*tos 1 .net c# xml xslt xpath

我正在编写一个C#/ VB程序,用于根据XML中收到的信息报告数据.

我的情况是我每月收到许多XML(大约100-200) - 每个大小从10mb到350mb不等.对于这些XML中的每一个,我只需要一小部分数据(少于任何一个文件的整个数据的5%),以便生成必要的报告.

此外,该数据子集将始终保持在相同的键结构中(它可能存在于多个键中,也可能存在于不同的级别,但它始终存在于相同的键名中/包含它的键将始终具有具有相同的属性,如"名称"等)

所以,我目前关于如何做到这一点的想法是:

  1. 创建一个"scraper",它将使用XPath从XML中提取必要的数据.
  2. 将SQL Server表中的小部分必要数据与存储在单独表中的文件特征数据一起存储,以便知道这些数据来自哪个文件
  3. 将数据查询到程序中以进行报告.

我的主要问题是什么才是最好的方法来获取数据?我最熟悉XPath,但是对于200MB大小的多个文件,我担心在整个文件中加载性能问题.

我见过/研究的其他事情是:

  1. 创建一个XSLT文件,只从XML转换/拉取我想要的数据
  2. 使用Linq到XML
  3. 以某种方式将XML链接到SQL服务器,然后能够直接查询它们
  4. 使用ADO从程序中查询XML
  5. 使用XMLReader类完成它(而不是完全加载每个XML)
  6. 也许有一个原生的.Net组件已经很好地做到了这一点

老实说,我不知道标准是什么,因为大量的XML和文件大小的差异,我不熟悉任何其他方法 - 例如,链接XMLs到SQL Server直接/使用ADO来查询XML - 因此,不知道它们可能的好处/缺点.

如果你们中的任何一个人处于类似的情况,我真的很感激任何一种正确方向的指针/至少验证我的方法不是最糟糕的那个:)

谢谢!!!

Mar*_*nen 6

至于内存消耗和性能问题,.NET XML API的一个很好的特性是你可以将XmlReader与XPathDocument或XmlDocument或XElement结合起来,只是有选择地将部分文档读入内存,然后具有XPath或LINQ to XML功能可用于该部分.LINQ to XML有http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom%28v=vs.110%29.aspx这样做,DOM/XmlDocument有http:/ /msdn.microsoft.com/en-us/library/system.xml.xmldocument.readnode%28v=vs.110%29.aspx.因此,根据您的XML结构,您可以使用XmlReader快速读取XML,而不会消耗太多内存,然后,当您拥有您感兴趣的元素时,您可以将其读入XElement(LINQ to XML)或XmlNode(DOM)然后将LINQ应用于XML和/或XPath以读取详细信息.