从XML中提取一小部分数据

时间:2014-06-17 17:14:13

标签: c# .net xml xslt xpath

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

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

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

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

  1. 创建"刮刀"这将使用XPath从XML中提取必要的数据。
  2. 将SQL Server表中必需数据的小部分与存储在单独表中的文件特征数据一起存储,以便知道这些数据来自哪个文件
  3. 将数据查询到程序中进行报告。
  4. 我的主要问题是什么是将数据删除的最佳方法? 我最熟悉XPath,但是对于200MB大小的多个文件,我担心在整个文件中加载性能问题。

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

    1. 创建一个XSLT文件,仅从XML转换/提取我想要的数据
    2. 使用Linq to XML
    3. 以某种方式将XML链接到SQL服务器,然后能够直接查询它们
    4. 使用ADO从程序中查询XML
    5. 使用XMLReader类(而不是完全加载每个XML)
    6. 也许有一个原生的.Net组件已经很好地完成了这项工作
    7. 老实说,我不知道标准是什么,因为大量的XML和文件大小的差异很大,而且我不熟悉其他任何方法 - 例如,例如,直接将XML链接到SQL Server /使用ADO查询XML - 因此,不知道它们可能带来的好处/缺点。

      如果你们中任何一个人处于类似情况,我真的会欣赏正确方向的任何指针/至少验证我的方法不是最差的一个在那里:)

      感谢!!!

1 个答案:

答案 0 :(得分:6)

至于内存消耗和性能问题,.NET XML API的一个很好的特性是你可以将XmlReader与XPathDocument或XmlDocument或XElement结合起来,只是选择性地将部分文档读入内存,然后使用XPath或LINQ。到该部分可用的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,而不会消耗太多内存,然后,当您拥有您感兴趣的元素时,可以将其读入{{1然后将LINQ应用于XML和/或XPath以读取详细信息(LINQ to XML)或XElement(DOM)。