2010-07-26 233 views
0

我需要设计一个驻留在组织内部网中的Windows应用程序。应用程序将部署在用户的计算机上,用户将在具有预定义模式的XML文件中生成输出。该XML将被写出到其他用户可以访问的联网文件夹中。这些文件被命名为userid_output.xml。 “userid”是从应用程序环境中提取的。在使用应用程序时,用户应该有能力搜索由用户范围生成的所有XML直到该点。检索到的信息将驱使用户塑造他/她的应用程序输入。一个非常坚定的要求是不要使用任何RDBMS(Oracle/Sql Server/MySql等)来存储XML。共享网络文件夹为“THE REPOSITORY”,仅用于存储XML。承载共享文件夹的计算机可能不运行任何可能有助于索引XML或优化用于搜索目的的数据的服务。在共享文件夹中的XML文件中快速搜索

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

谢谢

+0

这听起来像一些非常可怕的要求。我们是否理解,重点是要解析通过磁盘上不可识别的XML文件的方式,以最快的方式执行搜索,而不进行任何索引? – StriplingWarrior 2010-07-26 15:10:41

+1

如果我受到这样的限制,我会说再见,解释说如果没有交易工具,我就无法完成工作。 – Oded 2010-07-26 15:12:03

+0

另一种方式是想以某种方式选择性地在客户端网站上提取XML并在内存中执行搜索,但是如果> 2000用户每天都输出GBytes数据的数据,则此方法会以相当快的速度失败。 – 2010-07-26 15:20:10

回答

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']

这将只返回sample1元素有一个属性id这等于someID

+0

谢谢。我以前没有使用XQuery的经验,但是在上面的代码片段中,您是使用collection()在存储在客户机器上的C:\ sample_xml目录中形成xml文件的内存中表示形式的?如果我们有7000个sample.xml文件,并且只对标签的属性id等于“someId”的值感兴趣,会发生什么?XQuery如何帮助以优化的方式返回子集而不会造成巨大的开销? – 2010-07-26 18:21:53

+0

XQuery与Linq2Xml有什么不同? – 2010-07-26 18:22:29

+0

@sc_ray - 对不起,我没有使用Linq2Xml的经验。我会在我的答案中再增加一个例子来说明我将如何缩小结果。 – 2010-07-26 19:36:29