从xml中提取一小部分数据
本文关键字:小部分 数据 提取 xml | 更新日期: 2023-09-27 18:08:56
我正在编写一个c#/VB程序,用于根据xml接收到的信息报告数据。
我的情况是,我每个月收到许多xml(大约100-200)—每个xml的大小从10mb到350mb不等。对于每一个xml,我只需要其数据的一小部分(少于任何一个文件全部数据的5%)就可以生成必要的报告。
此外,该数据子集将始终保存在相同的键结构中(它可能存在于多个键中,并且可能存在于不同的级别,但它将始终存在于相同的键名中/包含它的键将始终具有相同的属性,例如"name"等)
所以,我目前的想法是:
- 创建一个"scraper",它将使用XPath从xml中提取必要的数据。
- 将必要数据的一小部分存储在SQL Server表中,并将文件特征数据存储在单独的表中,以便知道该刮取的数据来自哪个文件
- 将数据查询到程序中进行报告。
我的主要问题是什么是最好的方法来抓取这些数据?我最熟悉XPath,但是对于200MB大小的多个文件,我担心在整个文件中加载时会出现性能问题。
我看到/研究过的其他事情是:
- 创建XSLT文件,仅从XML转换/提取我想要的数据
- 使用Linq转换XML
- 以某种方式将xml链接到SQL server,然后能够直接查询它们
- 使用ADO从程序内查询xml
- 使用XMLReader类(而不是完全加载每个XML)
- 也许有一个本地的。net组件已经做得很好了
老实说,我只是不知道标准是什么,因为有大量的XML和文件大小的巨大差异,我不熟悉任何其他的方法来做到这一点-例如,例如,将XML直接链接到SQL Server/使用ADO来查询XML -因此,不知道它们可能的优点/缺点。
如果你们中有人遇到过类似的情况,我将真的感谢任何指向正确方向的指针/至少验证我的方法不是最糟糕的方法:)
谢谢! !
至于内存消耗和性能问题,. 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以读出详细信息。