Asp.NET - C#.NET
我需要就以下设计问题提出建议:
我会收到日常的XML文件。它会改变数量,例如昨天收到了10个XML文件,今天收到了XML 56文件,可能还有明天的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查询或者其他但不知道要在谷歌上搜索的单词。
我正在考虑创建一个大型的database.table并读取所有XML并放入数据库表。但问题是一些xml属性非常庞大,就像2-3页一样。并且其他XML文件中的相同属性为空.. 因此,为每个XML属性创建NVARCHAR(MAX)并将它们放在table.field中....经过一段时间后,我的DATABASE将成为一个大怪物......
有人可以建议处理这个问题的最佳方法是什么?
答案 0 :(得分: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时间来反复做同样的事情。如果查询量不是很小,我会考虑在第一次调用List<XDocument>
时构建GetDocuments()
并提出一种方案,将该列表保留在内存中,直到收到新的XML文档为止(或者在收到新的XML文档时可能会更新它。)