Я не уверен на 100%, что понимаю вашу проблему.Я предполагаю, что запрос должен возвращать отдельные XML-документы, которые удовлетворяют определенным пользовательским критериям.
В этом случае моей отправной точкой, вероятно, будет реализация метода запроса одного XML-документа,то есть тот, который возвращает истину, если документ является хитом, и ложь в противном случае.По всей вероятности, я бы сделал параметр запроса запросом 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 каждый раз, когда выполняю запрос; я просто перенес всю эту работу на сервер базы данных.)
Это много времени ввода-вывода и процессорного времени, которое тратится на то, чтобы делать одно и то же снова и снова.Если объем запросов отличается от крошечного, я бы подумал о создании List<XDocument>
при первом вызове GetDocuments()
и придумал бы схему хранения этого списка в памяти до получения новых XML-документов (или, возможно, обновленияэто когда новые XML-документы получены).