Как преобразовать огромные XML-файлы в реляционные данные для выполнения запросов - PullRequest
2 голосов
/ 14 апреля 2009

У меня есть как минимум 100 xml-файлов, каждый размером около 300 МБ, с сообщениями электронной почты в основном в формате, указанном ниже.

Теперь мой вопрос: как мне получить эти данные, скажем, в базу данных SQL Sever, чтобы я мог выполнить запрос к этим данным? Мои запросы будут выглядеть следующим образом: отправил ли определенный человек электронное письмо другому определенному человеку в определенный период с определенными ключевыми словами по теме / телу и т. Д.

Вот что я пробовал:

1) Загрузка каждого файла XML в поле типа данных XML в SQL Server. При таком подходе я не мог придумать запросы Xpath (?), Чтобы сделать то, что мне нужно. Возможно ли вообще сделать это в Xpath?

2) Загрузка каждого файла в .NET DataSet с использованием ReadXML и ReadSchema. Кажется, это нормально загружается, и создается правильное число DataTable с внешними ключами и т. Д., Но это будет означать, что мне придется создать 100 наборов таблиц в базе данных. Каким-то образом объедините все в одну таблицу и выполните запрос.

Дайте мне знать, если у вас, ребята, есть другие предложения.

Спасибо.

<Message>
<MsgID>4651286700000CAA00EF00010000</MsgID>
<MsgTime>2007-05-21-01.04.39.000000</MsgTime>
<MsgTimeUTC>1179723879</MsgTimeUTC>
<MsgLang>CODE 1252</MsgLang>
<Sender>
    <UserInfo>
        <FirstName>X</FirstName>
        <LastName>Y</LastName>
        <AccountName>121212</AccountName>
        <CorporateEmailAddress>someone@somewhere.com</CorporateEmailAddress>
    </UserInfo>
</Sender>
<Recipient DeliveryType = " ">
    <UserInfo>
        <FirstName>A</FirstName>
        <LastName>B</LastName>
        <FirmNumber>7593</FirmNumber>
        <AccountName>STRATEGIC AS</AccountName>
        <AccountNumber>604806</AccountNumber>
        <CorporateEmailAddress>A@B.COM</CorporateEmailAddress>
    </UserInfo>
</Recipient>
<Subject>
    Please review the following
</Subject>
<Attachment>
    <FileName>37715772.htm</FileName>
    <FileID>503242486522279_37715772.htm</FileID>
    <FileSize>31175</FileSize>
</Attachment>
<MsgBody>
    This is the message Body
</MsgBody>

Ответы [ 7 ]

4 голосов
/ 14 апреля 2009

Использование компонента Массовая загрузка

http://support.microsoft.com/kb/316005

2 голосов
/ 14 апреля 2009

Вы можете попробовать использовать XmlReader.ReadSubtree () для чтения одного сообщения за раз. Загрузка всего файла в память не очень хорошая идея.

Теперь легко передать данные одного сообщения на сервер SQL, вы также можете передать XML и проанализировать его на сервере SQL (используя OPENXML ) в хранимой процедуре.

0 голосов
/ 02 октября 2009

Похоже, база данных не является обязательным требованием, это просто способ запроса. Если это так, попробуйте XMLMax, который должен загрузить ваш 300MB xml примерно за 20 секунд. Он имеет индексированный запрос xpath, и индексация должна занять около 15 минут. Другими вариантами будет собственная база данных xml. eXistDB с открытым исходным кодом, и у меня был один пользователь, который сказал мне, что он использовал его с xig-гигабайтом и очень доволен. Но на загрузку, индексирование и настройку данного XML-кода уходит много времени.

0 голосов
/ 15 апреля 2009

Если вам нужно сделать это один раз, я бы создал xslt для преобразования xml в операторы вставки SQL и выполнил полученный сценарий sql для заполнения таблиц. Это не вызовет проблем с памятью из-за больших файлов xml.

0 голосов
/ 15 апреля 2009

Использование служб интеграции SQL Server. Для этой задачи разработан адаптер источника XML с удобным конструктором, в котором вы можете выбрать узлы или атрибуты в вашем XML, которые превратятся в столбцы в вашей базе данных.

См. это сообщение в блоге от команды служб SSIS.

0 голосов
/ 15 апреля 2009

Я бы использовал метод ReadXML, который вы упомянули, но делал бы это по одному XML-файлу за раз, а затем использовал метод DataSet / DataTable Merge. Пока схемы одинаковы, они должны просто продолжать добавление к одним и тем же таблицам (больше строк вместо дублирующих таблиц) и убедитесь, что вы избавляетесь от XMLDocument или XMLTextReader, который вы использовали для этого файла каждый раз, так что память назад.

Когда вы все закончите, используйте SqlDataAdapter и SqlCommandBuilder для автоматической генерации ваших INSERT-статиций и сбрасывания их в таблицы SQL. Это проще, если вы используете проводник данных Visual Studio для генерации строго типизированного набора данных.

Возможно, вы даже захотите делать это периодически и очищать свой набор данных, чтобы сохранить память.

0 голосов
/ 14 апреля 2009

Если вы ищете для выполнения запросов, почему бы не использовать вместо этого XML LINQ. Вероятно, было бы проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...