Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2011, 03:27
manco manco вне форума
Прохожий
 
Регистрация: 01.09.2011
Сообщения: 4
Репутация: 10
По умолчанию Экспорт из XML в Access

Доброго времени суток!!
Уважаемые форумчане помогите, пожалуйста с моей проблемой:

Мне поступают XML-файлы для загрузки в основную БД. Количество строк в файлах может быть от одной до нескольких десятков тысяч.
Файлы содержат логические, текстовые и цифровые данные.
Также в данных могут быть ошибки и для их исправления приходится вручную колупать основную БД. Это очень тяжело и трудоемко.

Я хочу сделать утилиту для проверки данных в файлах. Для этого загрузить данные во временную БД (например Access), проверить и очистить БД. Изменять и переписывать в XML-файлах ничего не нужно. Структуру файлов тоже изменить не могу. Саму БД сделаю заранее и поля в ней будут соответствовать тегам XML-файла.

Подскажите с помощью каких инструментов в Delphi и какими методами сделать загрузку данных из XML-файлов!

В интернете роюсь уже несколько дней и ничего подходящего не нашел. Я не профессиональный программист и в Delphi не очень силен. Пытаюсь разораться самостоятельно, потому опишите подсказки по подробней или дайте рабочий текст кода (если это не тяжело). Помогите, пожалуйста, очень нужно!!!
У меня стоит Win XP SP2 и Delphi 7. Урезанный пример XML-файла прикрепил к теме.

Огромное спасибо за помощь.
Вложения
Тип файла: rar test.rar (517 байт, 14 просмотров)
Ответить с цитированием
  #2  
Старый 02.09.2011, 07:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну если просто перечислить, то:
1. ADOQuery (и с ним другие ADO компоненты) - работы с БД
2. TXMLDocument - чтение xml
3. Прямые руки - написание связующего кода
4. Книжка по проектированию БД (не обязательно, но полезно будет, т.к. у тебя там как минимум 2 таблицы получаются. Или заголовок не нужен, а только сами табличные данные?)
Ответить с цитированием
  #3  
Старый 02.09.2011, 08:22
manco manco вне форума
Прохожий
 
Регистрация: 01.09.2011
Сообщения: 4
Репутация: 10
По умолчанию

С ADO сталкивался (должен разобраться).

А вот о TXMLDocument - чтение xml можно по подробней рассказать.
Я уже натыкался на него в инете, но как его использовать не разберу и описания не нашел. Дайте, плиз, ссылки на книги-статьи где все это можно прочитать подробно.

С написанием кода как раз и есть проблемы.

В принципе нужны только данные. Или вставлять для каждой записи в таблице данные из заголовка (так получается если открываю файл в Excel).

Спасибо!
Ответить с цитированием
  #4  
Старый 02.09.2011, 09:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

проще говоря тебе нужно все <ROW></ROW> в таблицу бд загнать?
добавлено позже:
кста, твой test.xml "корявенький". его ни браузер, ни TXMLDocument не открывает - нужно будет "предварительно руками" исправлять ошибки.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 02.09.2011 в 09:24.
Ответить с цитированием
  #5  
Старый 02.09.2011, 09:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно поступить попроще. Открыть ваш xml файл в экселе. При этом вы получите результат в табличном виде, а уже таблицу то вы сможете в акцес принять.
ПС: Хотя нет, эксель ваш файл не сможет открыть правильно. Видимо действительно TXMLDocument использовать надо.
ПСС: Мда блин. В общем получается такая хрень, как я понял документ ваш подготовлен с учетом формата XML который появляется в Net Framework 4.0. Думал в семерке будет без проблем его открыть, тоже не вышло. TXMLDocument тоже не удалось натравить на ваш файл видимо по той-же причине. Не установлен Net Framework 4.0
Можно конечно и ручками все распарсить, но как-то стремно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 02.09.2011 в 10:12.
Ответить с цитированием
  #6  
Старый 02.09.2011, 13:59
manco manco вне форума
Прохожий
 
Регистрация: 01.09.2011
Сообщения: 4
Репутация: 10
По умолчанию

Да все верно: мне нужно все <ROW></ROW> в таблицу БД загрузить.

А файл кривой наверно я сделал, когда урезал данные в нем. Прикрепил новый. В Excel-е открывается так как нужно.

Страдалецъ
Открывать через Excel я думал, но возможно ли это сделать программно в утилите? Или опять таки вручную открывать сохранять и загружать в Акцес.
Я сейчас и так проверяю их в Excel-е вручную. Глаза рвать целый день - утомительно. Хочу все сделать автоматом: по нажатии кнопки провести проверку и если есть ошибки вернуть файл со списком ошибок для исправления.
Вложения
Тип файла: rar test.rar (596 байт, 22 просмотров)
Ответить с цитированием
  #7  
Старый 02.09.2011, 14:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А где описатель схемы E04T06D.xsd к этому файлу?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 02.09.2011, 15:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вот один из вариантов:
Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    XMLDocument1: TXMLDocument;

var
  l: Integer;
  i: Integer;
  ADOMNodeList: IDOMNodeList;
  ADOMNode: IDOMNode;
  j: Integer;
begin
  if OpenDialog1.Execute then
  begin
    XMLDocument1.LoadFromFile(OpenDialog1.FileName);
    ADOMNodeList:=XMLDocument1.DOMDocument.getElementsByTagName('ROW');
    l:=ADOMNodeList.length;
    for i:=0 to l-1 do
    begin
      ADOMNode:=ADOMNodeList.item[i];
      if i=0 then
      begin
        ClientDataSet1.FieldDefs.Clear;
        for j:=0 to ADOMNode.childNodes.length-1 do
        begin
          ClientDataSet1.FieldDefs.Add(ADOMNode.childNodes.item[j].nodeName, ftString, 10);
        end;
        ClientDataSet1.CreateDataSet;
      end;
      ClientDataSet1.Append;
      for j:=0 to ADOMNode.childNodes.length-1 do
      begin
        if ADOMNode.childNodes.item[j].childNodes.length>0 then
          ClientDataSet1.FieldByName(ADOMNode.childNodes.item[j].nodeName).AsString:=
            ADOMNode.childNodes.item[j].childNodes.item[0].nodeValue
        else if ADOMNode.childNodes.item[j].attributes.length>0 then
          ClientDataSet1.FieldByName(ADOMNode.childNodes.item[j].nodeName).AsString:=
            ADOMNode.childNodes.item[j].attributes.item[0].nodeValue;
      end;
      ClientDataSet1.Post;
    end;
  end;
Вложения
Тип файла: rar xml.rar (2.6 Кбайт, 39 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 03.09.2011, 20:29
einstein einstein вне форума
Начинающий
 
Регистрация: 02.09.2010
Адрес: Город
Сообщения: 143
Репутация: -4653
По умолчанию

сколько готов заплатить?
Ответить с цитированием
  #10  
Старый 04.09.2011, 00:06
manco manco вне форума
Прохожий
 
Регистрация: 01.09.2011
Сообщения: 4
Репутация: 10
Хорошо

Цитата:
Сообщение от NumLock
вот один из вариантов:
Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    XMLDocument1: TXMLDocument;

var
  l: Integer;
  i: Integer;
  ADOMNodeList: IDOMNodeList;
  ADOMNode: IDOMNode;
  j: Integer;
begin
  if OpenDialog1.Execute then
  begin
    XMLDocument1.LoadFromFile(OpenDialog1.FileName);
    ADOMNodeList:=XMLDocument1.DOMDocument.getElementsByTagName('ROW');
    l:=ADOMNodeList.length;
    for i:=0 to l-1 do
    begin
      ADOMNode:=ADOMNodeList.item[i];
      if i=0 then
      begin
        ClientDataSet1.FieldDefs.Clear;
        for j:=0 to ADOMNode.childNodes.length-1 do
        begin
          ClientDataSet1.FieldDefs.Add(ADOMNode.childNodes.item[j].nodeName, ftString, 10);
        end;
        ClientDataSet1.CreateDataSet;
      end;
      ClientDataSet1.Append;
      for j:=0 to ADOMNode.childNodes.length-1 do
      begin
        if ADOMNode.childNodes.item[j].childNodes.length>0 then
          ClientDataSet1.FieldByName(ADOMNode.childNodes.item[j].nodeName).AsString:=
            ADOMNode.childNodes.item[j].childNodes.item[0].nodeValue
        else if ADOMNode.childNodes.item[j].attributes.length>0 then
          ClientDataSet1.FieldByName(ADOMNode.childNodes.item[j].nodeName).AsString:=
            ADOMNode.childNodes.item[j].attributes.item[0].nodeValue;
      end;
      ClientDataSet1.Post;
    end;
  end;


Да! Это то что нужно!!
Примерно понял как нужно делать, теперь буду подстраивать под свою утилиту.

Спасибо, огромное NumLock за помощь!!!


P.S.
Хотел еще вот что спросить: читал в сети, что с XML-файлами можно работать как с готовой таблицей БД. Так ли это?
В чем отличия от работы с СУБД Access или другими? Есть ли преимущества? Слишком это сложно?

Вопросы чисто для спортивного интереса, свою программку буду делать на том, что знаю...
Спасибо!

Последний раз редактировалось manco, 04.09.2011 в 00:13.
Ответить с цитированием
  #11  
Старый 04.09.2011, 08:54
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да, xml можно запросто использовать для хранения данных. TClientDataSet к примеру умеет это делать.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter