【问题标题】:Fast search within XML files in a shared folder在共享文件夹中的 XML 文件中快速搜索
【发布时间】:2010-07-26 15:03:19
【问题描述】:

我需要设计一个将驻留在组织内部网中的 Windows 应用程序。该应用程序将部署在用户的机器上,并且用户将在具有预定义模式的 XML 文件中生成输出。此 XML 将被写入其他用户可以访问的网络文件夹。这些文件被命名为 userid_output.xml。 “用户标识”是从应用程序环境中提取的。在使用该应用程序时,用户应该能够搜索由用户世界生成的所有 XML,直到那时为止。检索到的信息将促使用户塑造他/她的应用程序输入。一个非常严格的要求是不使用任何 RDBMS(Oracle/Sql Server/MySql 等)来存储 XML。共享网络文件夹是“THE REPOSITORY”,仅用于存储 XML。托管共享文件夹的机器可能不会运行任何有助于索引 XML 或优化数据以进行搜索的服务。

鉴于这些限制,是否有人知道任何设计技术/工具/机制来从这个“数据集”执行快速信息检索?

谢谢

【问题讨论】:

  • 这些听起来像是一些非常糟糕的要求。我们是否理解重点是通过磁盘上无数的 XML 文件来解析您的方式,以便以最快的方式执行搜索,而不需要任何索引?
  • 如果我被步履蹒跚到这种程度,我会说再见,并解释说如果没有行业工具,我将无法完成我的工作。
  • 我认为的另一种方法是以某种方式选择性地提取客户端站点上的 XML 并在内存中执行搜索,但如果 > 2000 个用户每天输出 GBytes 的数据,这种方法将很快失败。
  • 所以你甚至不能在存储库中存储索引文件?
  • 此外,即使是 XPath 也不是一个巨大的加速,因为使用 XPath 仍然需要再次解析 XML。它们可以加快速度并帮助查找要解析的文件,但它们不像数据库索引。

标签: .net xml search indexing real-time


【解决方案1】:

您可以使用 XQuery。 collection() 函数允许您查询 XML 文件的目录。

这是一个使用撒克逊语的示例。 (我不确定其他实现是否相同。):

collection("file:///C:/sample_xml?select=*.xml;")

这将选择C:\sample_xml 目录中的所有*.xml 文件。

您还可以使用 XPath 缩小结果范围:

collection("file:///file://///srv1/dir1/sample_xml?select=*.xml;")/doc/sample1[@id='someID']

这将仅返回具有等于someID 的属性idsample1 元素。

【讨论】:

  • 谢谢。我以前没有使用 XQuery 的经验,但是在上面的 sn-p 中,您是否使用 collection() 来形成存储在客户端计算机上的 C:\sample_xml 目录中 xml 文件的内存表示?如果我们有 7000 个 sample.xml 文件并且只对属性 id 等于“someId”的标签 的值感兴趣,会发生什么? XQuery 如何帮助以优化的方式返回该子集而不会产生大量开销?
  • XQuery 与 Linq2Xml 之类的东西有何不同?
  • @sc_ray - 抱歉,我没有使用 Linq2Xml 的经验。我将在我的答案中添加另一个示例,以展示我将如何缩小结果范围。
  • 我还在第二个示例中使用了 UNC 路径来展示我将如何访问网络目录。
  • 谢谢。但是 XQuery 是在网络文件夹本身上做繁重的工作,还是它“选择、传输,然后处理大量数据”。我在以下帖子stackoverflow.com/questions/214060/using-xquery-in-linq-to-sql 中阅读了这些内容
猜你喜欢
  • 2019-10-28
  • 2017-12-11
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2020-07-12
  • 2014-10-14
  • 2012-03-17
  • 2022-06-30
相关资源
最近更新 更多