Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/макрос для парсинга массива xml файлов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » макрос для парсинга массива xml файлов (Макросы/Sub)
макрос для парсинга массива xml файлов
mirash91 Дата: Воскресенье, 27.12.2015, 20:01 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Народ, накорябал файлик, парсит и считает как надо только 1н файл, прошу направить в нужном русле:
1)Чтобы парсило группу файлов
2)данные следующего считанного файла вставлялись на следующей строке, а не заменяли существующие
В VBA не спец, так что прошу особо не бить за корявый код:(
зы. грешу на то, что зря все в функцию записал, пробовал разделять, но ничего толкового из этого не вышло.
К сообщению приложен файл: 2769241.xls (51.5 Kb) · primer.xml (2.0 Kb)


Сообщение отредактировал mirash91 - Воскресенье, 27.12.2015, 20:03
 
Ответить
СообщениеНарод, накорябал файлик, парсит и считает как надо только 1н файл, прошу направить в нужном русле:
1)Чтобы парсило группу файлов
2)данные следующего считанного файла вставлялись на следующей строке, а не заменяли существующие
В VBA не спец, так что прошу особо не бить за корявый код:(
зы. грешу на то, что зря все в функцию записал, пробовал разделять, но ничего толкового из этого не вышло.

Автор - mirash91
Дата добавления - 27.12.2015 в 20:01
krosav4ig Дата: Понедельник, 28.12.2015, 00:39 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
mirash91, почему в xml две сущности group с кодами GYYYYYYY PYYYYYYY, но сумма атрибутов power из обоих пишется в строку с GYYYYYYY?
по какому признаку связаны сущности group и adjacent (почему суммируется в строку с GYYYYYYY, а не с PYYYYYYY?)?
В общем словами опишите общий алгоритм разбора xml


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеmirash91, почему в xml две сущности group с кодами GYYYYYYY PYYYYYYY, но сумма атрибутов power из обоих пишется в строку с GYYYYYYY?
по какому признаку связаны сущности group и adjacent (почему суммируется в строку с GYYYYYYY, а не с PYYYYYYY?)?
В общем словами опишите общий алгоритм разбора xml

Автор - krosav4ig
Дата добавления - 28.12.2015 в 00:39
mirash91 Дата: Понедельник, 28.12.2015, 19:44 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
krosav4ig, спасибо, что откликнулись, проблемы решил.
з.ы. файл для примера корявый был сам по себе.
з.ы.ы. проблема написания всех атрибутов в одну строку мною и была озвучена)
Тему можно закрыть.
 
Ответить
Сообщениеkrosav4ig, спасибо, что откликнулись, проблемы решил.
з.ы. файл для примера корявый был сам по себе.
з.ы.ы. проблема написания всех атрибутов в одну строку мною и была озвучена)
Тему можно закрыть.

Автор - mirash91
Дата добавления - 28.12.2015 в 19:44
krosav4ig Дата: Понедельник, 28.12.2015, 22:55 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
mirash91, посмотрите файл, для разнообразия
К сообщению приложен файл: 2128522.xls (55.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеmirash91, посмотрите файл, для разнообразия

Автор - krosav4ig
Дата добавления - 28.12.2015 в 22:55
mirash91 Дата: Понедельник, 11.01.2016, 10:50 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
mirash91, посмотрите файл, для разнообразия

правильно я понимаю, что для использования данного файла, excel должен знать xml карту "package_карта" ?


Сообщение отредактировал mirash91 - Понедельник, 11.01.2016, 10:50
 
Ответить
Сообщение
mirash91, посмотрите файл, для разнообразия

правильно я понимаю, что для использования данного файла, excel должен знать xml карту "package_карта" ?

Автор - mirash91
Дата добавления - 11.01.2016 в 10:50
krosav4ig Дата: Понедельник, 11.01.2016, 13:34 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
mirash91, ага, я её создал из вашего xml файла создание карты импорта xml
Добавил обновление подключения, удалил лишние подключения
К сообщению приложен файл: 2190436.xls (64.0 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 11.01.2016, 13:52
 
Ответить
Сообщениеmirash91, ага, я её создал из вашего xml файла создание карты импорта xml
Добавил обновление подключения, удалил лишние подключения

Автор - krosav4ig
Дата добавления - 11.01.2016 в 13:34
mirash91 Дата: Понедельник, 11.01.2016, 14:13 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
krosav4ig, но ведь вся бяда в том, что карты у файлов у всех (их много) будут разные, а эксель же может одновременно только с одной картой?
Если б одна схема на всех была бы, я бы просто импортировал файлы через стандартный импорт
 
Ответить
Сообщениеkrosav4ig, но ведь вся бяда в том, что карты у файлов у всех (их много) будут разные, а эксель же может одновременно только с одной картой?
Если б одна схема на всех была бы, я бы просто импортировал файлы через стандартный импорт

Автор - mirash91
Дата добавления - 11.01.2016 в 14:13
krosav4ig Дата: Понедельник, 11.01.2016, 16:15 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
mirash91, в смысле разные? у ваших файлов разная структура?


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеmirash91, в смысле разные? у ваших файлов разная структура?

Автор - krosav4ig
Дата добавления - 11.01.2016 в 16:15
mirash91 Дата: Понедельник, 11.01.2016, 17:02 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
krosav4ig, структура одинаковая, корневой тэг может отличаться, а от этого пляшет и карта, так ведь? соответственно под каждый файл нужна своя карта
 
Ответить
Сообщениеkrosav4ig, структура одинаковая, корневой тэг может отличаться, а от этого пляшет и карта, так ведь? соответственно под каждый файл нужна своя карта

Автор - mirash91
Дата добавления - 11.01.2016 в 17:02
anvg Дата: Понедельник, 11.01.2016, 18:26 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
Цитата
структура одинаковая, корневой тэг может отличаться

Напишите тогда собственную xsd-схему и определите в ней замещение элементов. Правда, тогда придётся прописывать ссылку на схему в каждый xml-файл, скорее всего.
Если файлы одной карты, уже загруженной в Excel, то можно в таблицу, ассоциированную со схемой, загружать импортом несколько файлов. Ctrl+A в окне выбора файлов.

Успехов.
 
Ответить
СообщениеДоброе время суток
Цитата
структура одинаковая, корневой тэг может отличаться

Напишите тогда собственную xsd-схему и определите в ней замещение элементов. Правда, тогда придётся прописывать ссылку на схему в каждый xml-файл, скорее всего.
Если файлы одной карты, уже загруженной в Excel, то можно в таблицу, ассоциированную со схемой, загружать импортом несколько файлов. Ctrl+A в окне выбора файлов.

Успехов.

Автор - anvg
Дата добавления - 11.01.2016 в 18:26
krosav4ig Дата: Понедельник, 11.01.2016, 20:16 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
anvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимое


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеanvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимое

Автор - krosav4ig
Дата добавления - 11.01.2016 в 20:16
anvg Дата: Вторник, 12.01.2016, 05:47 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
Цитата
в excel не поддерживается ни замещение,
krosav4ig, спасибо за информацию. Только начинаю "ковырять" это хозяйство. Уже, правда, нарывался на невозможность использовать импортированную схему для последующего экспорта - проверку не проходит - пишет "Ненормированные данные".
Тогда для mirash91, учитывая что
Цитата
структура одинаковая, корневой тэг может отличаться
будет лучше через MSXML2.DOMDocument60 считывать содержимое xml-файла, затем получать xml-строку содержимого, менять название корневого тэга на корневой тэг определённый в загруженной карте, а затем воспользоваться методом XmlMap.ImportXml этой карты для импорта этой изменённой строки в таблицу.
 
Ответить
СообщениеДоброе время суток
Цитата
в excel не поддерживается ни замещение,
krosav4ig, спасибо за информацию. Только начинаю "ковырять" это хозяйство. Уже, правда, нарывался на невозможность использовать импортированную схему для последующего экспорта - проверку не проходит - пишет "Ненормированные данные".
Тогда для mirash91, учитывая что
Цитата
структура одинаковая, корневой тэг может отличаться
будет лучше через MSXML2.DOMDocument60 считывать содержимое xml-файла, затем получать xml-строку содержимого, менять название корневого тэга на корневой тэг определённый в загруженной карте, а затем воспользоваться методом XmlMap.ImportXml этой карты для импорта этой изменённой строки в таблицу.

Автор - anvg
Дата добавления - 12.01.2016 в 05:47
krosav4ig Дата: Среда, 13.01.2016, 17:00 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
на всякий случай набросал пару вариантов решения, предложенного anvg
[vba]
Код
Public Sub ReadXML2()
    Dim XMLFileName As Variant
    Dim bool As Boolean: bool = True
    Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom")
    For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True)
        XmlDom.Load XMLFileName
        With CreateObject("vbscript.regexp")
            .Pattern = "([</]{1,2})" & XmlDom.SelectNodes("//group")(0).ParentNode.nodeName & "([^>]*\>)"
            .Global = True
            ActiveWorkbook.XmlMaps("package_карта").ImportXml _
                IIf(.test(XmlDom.XML), .Replace(XmlDom.XML, "$1package$2"), XmlDom.XML), bool
        End With
        bool = False
    Next
    Set XmlDom = Nothing
    With Sheets("xml").ListObjects("Запрос")
        .Refresh
        .DataBodyRange.Copy
    End With
    With Sheets("Лист1").ListObjects("TBL")
        .HeaderRowRange(1).Offset([tbl].Rows.Count + _
            IIf(.DataBodyRange Is Nothing, 0, 1)). _
                PasteSpecial xlPasteValues
    End With
End Sub
[/vba]

[vba]
Код
Public Sub ReadXML2_1()
    Dim XMLFileName As Variant
    Dim bool As Boolean: bool = True
    Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom")
    Dim Elem As Object, newElem As Object, ChildElem As Object
    For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True)
        XmlDom.Load XMLFileName
        Set Elem = XmlDom.SelectNodes("//group")(0).ParentNode
        If Elem.nodeName <> "package" Then
            Set newElem = XmlDom.createElement("package")
            For Each ChildElem In Elem.ChildNodes
                Call newElem.appendChild(ChildElem)
            Next
            Call Elem.ParentNode.replaceChild(newElem, Elem)
            Set Elem = Nothing: Set newElem = Nothing
        End If
        ActiveWorkbook.XmlMaps("package_карта").ImportXml XmlDom.XML, bool
        bool = False
    Next
    Set XmlDom = Nothing
    With Sheets("xml").ListObjects("Запрос")
        .Refresh
        .DataBodyRange.Copy
    End With
    With Sheets("Лист1").ListObjects("TBL")
        .HeaderRowRange(1).Offset([tbl].Rows.Count + _
            IIf(.DataBodyRange Is Nothing, 0, 1)). _
                PasteSpecial xlPasteValues
    End With
End Sub
[/vba]
К сообщению приложен файл: 2214862.xls (30.0 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 13.01.2016, 17:04
 
Ответить
Сообщениена всякий случай набросал пару вариантов решения, предложенного anvg
[vba]
Код
Public Sub ReadXML2()
    Dim XMLFileName As Variant
    Dim bool As Boolean: bool = True
    Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom")
    For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True)
        XmlDom.Load XMLFileName
        With CreateObject("vbscript.regexp")
            .Pattern = "([</]{1,2})" & XmlDom.SelectNodes("//group")(0).ParentNode.nodeName & "([^>]*\>)"
            .Global = True
            ActiveWorkbook.XmlMaps("package_карта").ImportXml _
                IIf(.test(XmlDom.XML), .Replace(XmlDom.XML, "$1package$2"), XmlDom.XML), bool
        End With
        bool = False
    Next
    Set XmlDom = Nothing
    With Sheets("xml").ListObjects("Запрос")
        .Refresh
        .DataBodyRange.Copy
    End With
    With Sheets("Лист1").ListObjects("TBL")
        .HeaderRowRange(1).Offset([tbl].Rows.Count + _
            IIf(.DataBodyRange Is Nothing, 0, 1)). _
                PasteSpecial xlPasteValues
    End With
End Sub
[/vba]

[vba]
Код
Public Sub ReadXML2_1()
    Dim XMLFileName As Variant
    Dim bool As Boolean: bool = True
    Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom")
    Dim Elem As Object, newElem As Object, ChildElem As Object
    For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True)
        XmlDom.Load XMLFileName
        Set Elem = XmlDom.SelectNodes("//group")(0).ParentNode
        If Elem.nodeName <> "package" Then
            Set newElem = XmlDom.createElement("package")
            For Each ChildElem In Elem.ChildNodes
                Call newElem.appendChild(ChildElem)
            Next
            Call Elem.ParentNode.replaceChild(newElem, Elem)
            Set Elem = Nothing: Set newElem = Nothing
        End If
        ActiveWorkbook.XmlMaps("package_карта").ImportXml XmlDom.XML, bool
        bool = False
    Next
    Set XmlDom = Nothing
    With Sheets("xml").ListObjects("Запрос")
        .Refresh
        .DataBodyRange.Copy
    End With
    With Sheets("Лист1").ListObjects("TBL")
        .HeaderRowRange(1).Offset([tbl].Rows.Count + _
            IIf(.DataBodyRange Is Nothing, 0, 1)). _
                PasteSpecial xlPasteValues
    End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 13.01.2016 в 17:00
Мир MS Excel » Вопросы и решения » Вопросы по VBA » макрос для парсинга массива xml файлов (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!