Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как загрузить в Access многоуровневый файл XML? / 18 сообщений из 18, страница 1 из 1
13.09.2012, 15:23
    #37956242
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Всем привет! Только закончил петь торжественные оды во имя славного Rivkin Dmitry , помогшего одолеть TXT файл, как новая беда нагрянула. Теперь надо загрузить в Access XML файл, да не простой, а многоуровневый.
Полазил по сему форуму, нашел много интересного, в том числе и по своей теме.
Остановился на варианте, предложенным уважаемым ?...? ( 8786754 ), да вот незадача, в данном примере рассмотрен случай с более простым документом. Достал бубен, пару дней колдовал над этим файлом, да так ничего и не вышло.
Так вот уважаемые форумчане, прошу Вашей помощи. Подскажите пожалуйста, как написать процедуру по загрузке файла XML.
P/S Вы уж сильно не пинайте, если что. Не грамотен я в этой области.
...
Рейтинг: 0 / 0
13.09.2012, 18:24
    #37956624
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
"Колдую" над файлом и понимаю, что в нормальный формат его не преобразовать. А можно ли сделать хотя бы такого вида как на прилагаемом файле?
...
Рейтинг: 0 / 0
13.09.2012, 19:49
    #37956738
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Форумчане, ОЧЕНЬ нужна помощь. Если есть конкретные предложения, пишите, (адрес в личке) обсудим сумму вознаграждения и условия оплаты.
...
Рейтинг: 0 / 0
13.09.2012, 20:01
    #37956754
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Шаман,

смотри в поиске по форуму MSXML2.DOMDocument

если несправишся - посмотрю через пару ч.
...
Рейтинг: 0 / 0
13.09.2012, 20:50
    #37956785
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
qwerty112Шаман,

смотри в поиске по форуму MSXML2.DOMDocument

если несправишся - посмотрю через пару ч.

Спасибо за наводку, но за два дня, большую часть из итого материала я уже просмотрел. Вся проблема в том, что с циклами я "не дружу", а посему и приходится "бубном" пользоваться.
qwerty112 у меня к Вам ОГРОМНАЯ ПРОСЬБА, помочь в этом вопросе. Предложение указанное выше остается в силе.
...
Рейтинг: 0 / 0
13.09.2012, 21:40
    #37956815
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
процедура haba в Module2
"в кнопку", уже сам сделаеш
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Sub haba()
On Error GoTo ErrExit
    Dim rs As Object 'DAO.Recordset
    Dim xmlDoc As Object 'MSXML2.DOMDocument
    Dim xmlNode As Object 'MSXML2.IXMLDOMNode
    Dim xmlNode1 As Object 'MSXML2.IXMLDOMNode
    Dim xmlAttribut As Object 'MSXML2.IXMLDOMAttribute
    Dim xmlNodeList As Object 'MSXML2.IXMLDOMNodeList
    Dim xml_path As String
    Dim FileName As String
    Dim NameOrg, INN, KPP
    '
    Set rs = CurrentDb.OpenRecordset("select * from Tab where 1=0")
    '
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    xmlDoc.async = False
    FileName = CurrentProject.path & "\Oborot.xml"
    If Not xmlDoc.Load(FileName) Then Exit Sub
    '
    xml_path = "/Файл/Документ/Оборот/СведПроизвИмпорт"
    Set xmlNodeList = xmlDoc.documentElement.selectNodes(xml_path)
    For Each xmlNode In xmlNodeList
        For Each xmlAttribut In xmlNode.Attributes
            Select Case xmlAttribut.Name
                Case "NameOrg": NameOrg = xmlAttribut.Value
                Case "INN": INN = xmlAttribut.Value
                Case "KPP": KPP = xmlAttribut.Value
            End Select
        Next
        '
        For Each xmlNode1 In xmlNode.childNodes
            rs.AddNew
            rs.Fields("_NameOrg") = NameOrg
            rs.Fields("_INN") = INN
            rs.Fields("_KPP") = KPP
On Error Resume Next
            For Each xmlAttribut In xmlNode1.Attributes
'                If xmlAttribut.Name Like "П*" Then  ' ???
                    rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
'                End If
            Next
On Error GoTo ErrExit
            rs.Update
        Next
    Next
    rs.Close
    MsgBox "Done!", vbInformation
    DoCmd.OpenTable "Tab"
FreeExit:
On Error Resume Next
    Set rs = Nothing
    Set xmlDoc = Nothing
    Exit Sub
ErrExit:
    MsgBox Err.Description, vbCritical
    Resume FreeExit
End Sub


_NameOrgКонкорд Майкопский пивоваренный завод ООООАО Ставропольский пивоваренный заводООО Первый Волжский вино-водочный комбинат ООО Рудо-Аква ф-л Лакинский пивзаводООО АГАТ ликеро-водочный завод ООО Ликеро-водочный завод ОшаООО Тихорецкий пивоваренный заводООО Югпиво

хорошо устроился ))
...
Рейтинг: 0 / 0
13.09.2012, 22:01
    #37956833
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
qwerty112, ПРОСТО СУПЕР!!! Респетише тебе.
Один маленький нюанс. Как добавить Код - первый столбец.
И еще, скинь свои координаты на мой маил, действительно, от души хочу отблагодарить.
...
Рейтинг: 0 / 0
13.09.2012, 22:05
    #37956834
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Шаманqwerty112, ПРОСТО СУПЕР!!! Респетише тебе.
Один маленький нюанс. Как добавить Код - первый столбец.

да, тоже заметил

вот добавь выделенное
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Dim NameOrg, INN, KPP, П000000000003
...
    For Each xmlNode In xmlNodeList
        П000000000003 = xmlNode.parentNode.Attributes(1).nodeValue
        For Each xmlAttribut In xmlNode.Attributes
            Select Case xmlAttribut.Name
                Case "NameOrg": NameOrg = xmlAttribut.Value
                Case "INN": INN = xmlAttribut.Value
                Case "KPP": KPP = xmlAttribut.Value
            End Select
        Next
        '
        For Each xmlNode1 In xmlNode.childNodes
            rs.AddNew
            rs.Fields("_П000000000003") = П000000000003
            rs.Fields("_NameOrg") = NameOrg
            rs.Fields("_INN") = INN



ШаманИ еще, скинь свои координаты на мой маил, действительно, от души хочу отблагодарить.
таа, "непереймайся" :))
...
Рейтинг: 0 / 0
13.09.2012, 22:17
    #37956848
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
qwerty112,
Даже нет слов чтобы выразить благодарность. Снимаю шляпу. Успехов в жизни тебе ДРУЖИЩЕ.
Еще раз СПАСИБО!!!
...
Рейтинг: 0 / 0
18.12.2012, 23:31
    #38084313
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Всем доброго времени суток. Позволю себе продолжить тему, закрытую 3 месяца назад.
Благодаря помощи форума и в частности уважаемого qwerty112 , удалось решить неприступную для меня задачу по импорту XML файла (Видит Бог, чуть ли не каждый день вспоминаю его добрым словом).
Но я, к своему сожалению за все это время, так и не "подружился" с циклами. Поэтому опять, после бесконечных танцев с "бубном", взываю к помощи.
Суть вопроса практически тоже самое, что и в заголовке топика. Различие только в файле XML.
Насколько смог, постарался решить проблему самостоятельно, но видимо не дорос еще до нужного уровня. Все подробности в прилагаемом файле. Вкратце могу только пояснить, что загрузка почти работает, но не отображаются ключевые данные. Либо на оборот - отображаются эти недостающие данные, но при этом пропадают остальные сведения. Как объединить все это в единое целое - для меня "полный ступор". Надеюсь, что для "посвященных" людей эта задача не составит большого труда.

p.s. заметил на форуме присутствие qwerty112 )))
...
Рейтинг: 0 / 0
19.12.2012, 11:59
    #38084737
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
ШаманВкратце могу только пояснить, что загрузка почти работает, но не отображаются ключевые данные. Либо на оборот - отображаются эти недостающие данные, но при этом пропадают остальные сведения. Как объединить все это в единое целое - для меня "полный ступор". Надеюсь, что для "посвященных" людей эта задача не составит большого труда.

значит, смотри,
самое простое в таком случае (загрузки в плоскую таблицу) - начинать с самого "нижнего" уровня
т.е. - через xml_path - задать самый "длинный" путь, и в цикле, выбрать всё нужное с него, после этого - "поднятся" на уровень выше (к "родительской" ноде) - Set xmlNode2 = xmlNode.parentNode
выбрать всё что нужно в ней, если нужно - "поднятся" ещё на уровень выше и т.д. вплоть до самого рута
в итоге будет что-то типа такого
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    xml_path = "/Файл/Документ/ОбъемОборота/Оборот/СведПроизвИмпорт/Движение"
    Set xmlNodeList = xmlDoc.documentElement.selectNodes(xml_path)
On Error Resume Next
    For Each xmlNode In xmlNodeList
        rs.AddNew
        ' Движение
        For Each xmlAttribut In xmlNode.Attributes
            rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
        Next
        ' СведПроизвИмпорт
        Set xmlNode2 = xmlNode.parentNode
        For Each xmlAttribut In xmlNode2.Attributes
            rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
        Next
        ' Оборот
        Set xmlNode2 = xmlNode2.parentNode
        For Each xmlAttribut In xmlNode2.Attributes
            rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
        Next
        ' ОбъемОборота
        Set xmlNode2 = xmlNode2.parentNode
        For Each xmlAttribut In xmlNode2.Attributes
            rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
        Next
        rs.Update
    Next



правда, есть один ньюанс
данные, на этом "нижнем" уровне - должны быть
вот в твоём файле, есть часть, когда это не соблюдается
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 <Поставщики ИдПостав="7" П000000000007="ООО "Дарлинг"">
 <Лицензии>
  <Лицензия ИдЛицензии="4" П000000000011="А,647571" П000000000012="06.06.2011" П000000000013="30.04.2012" П000000000014="Федеральная служба по регулированию алкогольного рынка" /> 
  </Лицензии>
 <Лицензии>
  <Лицензия ИдЛицензии="5" П000000000011="А,604419" П000000000012="02.05.2012" П000000000013="30.04.2017" П000000000014="Федеральная служба по регулированию алкогольного рынка" /> 
  </Лицензии>
  <ЮЛ П000000000009="2312079137" П000000000010="231201001" /> 
  </Поставщики>
 <Поставщики ИдПостав="17" П000000000007="Алина ПО ООО">
  <ЮЛ П000000000009="5433162593" П000000000010="543301001" /> 
  </Поставщики>

вот тут - "Лицензии" - просто не задан
в таком случае, имхо, самое правильное, - "забить" на одну "плоскую" таблицу и формировать 2-е нормализованных, - так как они в файле и заданны (2-е таб. Поставщики и Лицензии связанные 1:М)
типа такого
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    xml_path = "/Файл/Справочники/Поставщики"
    
    Set xmlNodeList = xmlDoc.documentElement.selectNodes(xml_path)
    For Each xmlNode In xmlNodeList
        rs.AddNew
        ' Заполняем всё из тега "Поставщики"
        For Each xmlAttribut In xmlNode.Attributes
            rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
        Next
        ' Теперь цикл по потомках тега "Поставщики"
        For Each xmlNode1 In xmlNode.childNodes
            If xmlNode1.nodeName = "ЮЛ" Then  ' - тег "ЮЛ" - в rs
                For Each xmlAttribut In xmlNode1.Attributes
                    rs.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
                Next
            End If
            If xmlNode1.nodeName = "Лицензии" Then  ' - тег "Лицензии" - в rs1
                ' цикл по тегам
                For Each xmlNode2 In xmlNode1.childNodes
                    rs1.AddNew
                    For Each xmlAttribut In xmlNode2.Attributes
                        rs1.Fields("_" & xmlAttribut.Name) = xmlAttribut.Value
                    Next
                    rs1.Fields("_ИДПостав") = rs.Fields("_ИДПостав")
                    rs1.Update
                Next
            End If
        Next
        rs.Update
    Next

...
Рейтинг: 0 / 0
19.12.2012, 12:14
    #38084774
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
qwerty112- "поднятся" на уровень выше (к "родительской" ноде) - Set xmlNode2 = xmlNode.parentNode
выбрать всё что нужно в ней, ...
или перейти к другой ноде на этом же уровне
Set xmlNode2 = xmlNode.nextSibling
Set xmlNode2 = xmlNode.previousSibling

вот тут, есть "годное" описание по MSXML2.DOMDocument
...
Рейтинг: 0 / 0
19.12.2012, 17:58
    #38085590
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Уважаемый qwerty112 ОГРОМНОЕ ВАМ СПАСИБО!!!!!!!!!!
Благодаря таким людям как Вы, в нашем мире остается доброта и взаимовыручка. (на Вы - это потому, что уважаю)
Отдельное спасибо за ликбез по работе с циклами. Очень полезная информация. И главное, после Ваших комментариев и примеров, я понял куда надо было "копать".
Еще раз, от всей души благодарю за помощь. Желаю удачи по жизни и главное здоровья!!!!!!

P.S. На мой взгляд, данный форум является самым лучшим источником информации и "палочкой-выручалочкой" по Access.
...
Рейтинг: 0 / 0
20.12.2012, 13:58
    #38086708
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Шаман...
P.S. На мой взгляд, данный форум является самым лучшим источником информации и "палочкой-выручалочкой" по Access.

Конечно. Здесь все. Никита, Стас, Гена, Турбо и Дюша Метелкин
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.02.2015, 22:13
    #38883374
Elenaspb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Уважаемый qwerty112, помогите!!!! SOS!!! У меня та же ситуация что у Шамана. Есть рабочая база Access с множеством данных, связанных таблиц, форм, запросов и отчетов, а так же есть вэб сайт, который предоставляет экспорт данных только в формате .XML. Нужно каким либо образом преобразовывать .XML в .mdb. Эти файлы нужно будет экспортировать постоянно. Вобщем задача сложная, по крайней мере для меня. Если для Вас это возможно, я бы объяснила подробнее в личке или по телефону. Вознаграждение гарантирую. Вот файлик XML.
...
Рейтинг: 0 / 0
18.02.2015, 23:15
    #38883404
1956
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить в Access многоуровневый файл XML?
Elenaspb,

Ваш файл, Эксель нормально открывает. Можно вот так, через конвертацию в Эксель-файл и загружать.
...
Рейтинг: 0 / 0
19.02.2015, 08:06
    #38883509
Как загрузить в Access многоуровневый файл XML?
Elenaspb,

получилось?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.10.2018, 23:10
    #39720193
Как загрузить в Access многоуровневый файл XML?
Доброй ночи,у меня приблизитено такая же проблема!только я имею 20 000 файлов xml и нужно загрузить данные в табличный вид,решили что в ассеss,чтобы потом создавать запросы и анализировать инфу!но как можно все файлы сразу загрузитьи как сделать так чтобы данные в таблицах были связаны?xml с разной структурой,но не сильно, данные по физикам и по юрикам!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как загрузить в Access многоуровневый файл XML? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]