【问题标题】:receiving everyday XML files - 12 types need to do search on these everyday接收日常 XML 文件 - 每天需要搜索 12 种类型
【发布时间】:2011-03-23 09:32:22
【问题描述】:

Asp.NET - C#.NET

我需要关于以下设计问题的建议:

我每天都会收到 XML 文件。它改变了数量,例如昨天收到 10 个 XML 文件,今天收到 56 个 XML 文件,明天可能收到 161 个 XML 文件,等等。

有 12 种类型(12 XSD)...顶部有一个名为 FormType 的属性,例如FormType="1"、FormType="2"、FormType="12" 等多达 12 种表单类型。

它们都有共同的字段,例如姓名、地址、电话。 但是例如FormType=1 用于建筑,FormType=2 用于 IT,FormType 3=医院,Formtype=4 用于广告等。

正如我所说,它们都有共同的属性。

要求: 需要一个搜索屏幕,以便用户可以对这些 XML 内容进行搜索。但我不知道如何处理这个问题。例如在某些属性的文本中搜索从 Date_From 和 Date_To 接收到的 xml。

问题: 我听说过将 XML 放在二进制字段中并执行 XPATH 查询或其他任何操作,但不知道要在 google 上搜索的单词。

我正在考虑创建一个大的 database.table 并读取所有 XML 并将其放入数据库表中。但问题是一些 xml 属性非常大,比如 2-3 页。并且其他 XML 文件中的相同属性为空.. 因此,为每个 XML 属性创建 NVARCHAR(MAX) 并将它们放入 table.field.... 一段时间后,我的 DATABASE 将成为一个大怪物...

有人可以建议处理此问题的最佳方法是什么吗?

【问题讨论】:

  • 我建议您将所有文件的 XML(完整 XML)保存在表的单个字段中,例如MyTable 具有字段, date , XML(nvarchar(max)) ,然后在存储过程中通过 sql 搜索它们,例如 select * from OPENXML() 。只是一个建议,如果适合您的目的,您可以自己深入研究
  • 你的意思是创建一个字段 nvarchar(max) 例如命名 XMLREceives。并通过 StreamWriter 将 XML 保存在该字段中(读取 XML 并将整个 XML 写入该字段)?那么搜索呢?例如location 是“Chicago”,是否需要读取所有记录并使用 XMLDocument 来检查 location 属性是否包含 Chicago?

标签: c# asp.net xml linq-to-xml


【解决方案1】:

我不是 100% 确定我理解您的问题。我猜该查询应该返回满足某种用户指定条件的单个 XML 文档。

在这种情况下,我的出发点可能是实现一种查询单个 XML 文档的方法,即如果文档成功则返回 true,否则返回 false。很可能,我会将查询参数设为 XPath 查询,但谁知道呢?这是一个简单的例子:

public bool TestXml(XDocument d, string query)
{
   return d.XPathSelectElements(query).Any();
}

接下来,我需要存储要查询的 XML 文档。那家商店住在哪里,它采取什么形式?在一定程度上,这些是我的应用程序不关心的实现细节。它们可以存在于数据库或文件系统中。它们可以缓存在内存中。我会先保持简单,比如:

public IEnumerable<XDocument> XmlDocuments()
{
   DirectoryInfo di = new DirectoryInfo(XmlDirectoryPath);
   foreach (FileInfo fi in di.GetFiles())
   {
      yield return XDocument.Load(fi.Filename);
   }
}

现在我可以获取满足这样一个请求的所有文档:

public IEnumerable<XDocument> GetDocuments(query)
{
   return XmlDocuments.Where(x => TextXml(x, query));
}

当我看到这个问题时,我突然想到的事情是:我必须将我的文档解析为 XDocument 对象来查询它们。无论它们是在数据库中还是在文件系统中,都会发生这种情况。 (如果我将它们放在数据库中并编写一个执行 XPath 查询的存储过程,正如有人建议的那样,我仍然在每次执行查询时解析所有 XML;我刚刚将所有工作转移到数据库服务器.)

大量的 I/O 和 CPU 时间都花在一遍又一遍地做完全相同的事情上。如果查询量不是很小,我会考虑在第一次调用GetDocuments() 时构建一个List&lt;XDocument&gt;,并提出一个将该列表保存在内存中的方案,直到接收到新的 XML 文档(或可能更新当接收到新的 XML 文档时显示)。

【讨论】:

  • 您好罗伯特,谢谢您的回复。好吧,我得到了你的解释,但也请澄清一下他的情况:我每天都会收到大约 10 封邮件。 50 个 XML 我应该将 XML 存储在数据库中吗?如何?就像 VARCHAR(NOMAX) 一样,还是我应该将它们作为外部文件放在网络上的文件夹中,并在搜索中满足条件时阅读它们?到年底,我将拥有 50.000 个 XML,因此我需要找到一种方法将它们存储在某个地方。所以问题是我应该将它们作为 TEXT 或不同的文件放在 DATABASE 中并使用 XDOCUMENT 阅读,还是应该将它们保存在文件夹中并使用 FileInfo-direcotry.getfiles() 等。请对此提出建议?
  • 嗯,我的回答的要点是,您物理存储 XML 文档的位置是与解析和查询问题不同的实现细节。将它们放入数据库或将它们放入文件系统中,上述方法仍然有效。虽然如果你要拥有 50,000 个,你最好找到一种方法来减少用户输入查询时需要搜索的数量(因为你必须解析一个文档来查询它),一些可以索引的非 XML 数据元素 - 然后是的,我会使用数据库。
  • 罗伯特,还有一个关于此的问题:您是否会将它们作为文本保存在数据库中,就像列 NVarchar(nomax) 中的整个 XML 一样?还是您会使用另一种列格式来减小大小?我的意思是我需要让他们在 50.000 XMl 上搜索至少 2 年,即 100.000 个活动 XML。那么您是否仍将 1 个 XML 存储在 1 列中并为数据库中的搜索部分创建单独的列? columnName、ColumnAdres、ColumnCity...、ColumnXMLContent。 ColumnXMLContent 是整个内容 XML 文件。请指教?
  • 如果您想让用户能够一次搜索 100,000 个活动 XML 文件的内容,您需要重新考虑问题。您可以问自己的最重要的事情不是“我应该以什么格式存储这些文档?”而是“我能做些什么来减少任何单个查询检查的文档数量?”所以是的,如果可能的话,我会将 XML 中的数据元素提取到表中的列中,并且只在最后的手段中搜索 XML 本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多