получение каждодневных файлов XML - 12 типов должны выполнять поиск по этим повседневным - PullRequest
0 голосов
/ 23 марта 2011

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 для ИТ, FormType 3 = Больница, Formtype = 4 для рекламы и т. Д. И т. Д.

Как я уже говорил, все они имеют общие атрибуты.

Требования: Требуется экран поиска, чтобы пользователь мог выполнять поиск по этому XML-содержимому.Но я понятия не имею, как подойти к этому.например, искать в тексте в некоторых атрибутах XML, полученные от Date_From и Date_To.

Проблема: Я слышал о том, как поместить XML в поле Binary и выполнить запрос XPATH или любой другой, кроме donНе знаю, что слово для поиска в Google.

Я думал создать большую базу данных.таблицу, прочитать все XML и поместить в таблицу базы данных.Но проблема в том, что некоторые xml-атрибуты очень большие, например, 2-3 страницы.и те же атрибуты в другом XML-файле пусты .. Так что создание NVARCHAR (MAX) для каждого атрибута XML и помещение их в table.field .... Через некоторое время моя БАЗА ДАННЫХ станет большим большим монстром ...

Может кто-нибудь посоветовать, как лучше всего решить эту проблему?

1 Ответ

1 голос
/ 25 марта 2011

Я не уверен на 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-документы получены).

...