Народ, накорябал файлик, парсит и считает как надо только 1н файл, прошу направить в нужном русле: 1)Чтобы парсило группу файлов 2)данные следующего считанного файла вставлялись на следующей строке, а не заменяли существующие В VBA не спец, так что прошу особо не бить за корявый код:( зы. грешу на то, что зря все в функцию записал, пробовал разделять, но ничего толкового из этого не вышло.
Народ, накорябал файлик, парсит и считает как надо только 1н файл, прошу направить в нужном русле: 1)Чтобы парсило группу файлов 2)данные следующего считанного файла вставлялись на следующей строке, а не заменяли существующие В VBA не спец, так что прошу особо не бить за корявый код:( зы. грешу на то, что зря все в функцию записал, пробовал разделять, но ничего толкового из этого не вышло.mirash91
mirash91, почему в xml две сущности group с кодами GYYYYYYY PYYYYYYY, но сумма атрибутов power из обоих пишется в строку с GYYYYYYY? по какому признаку связаны сущности group и adjacent (почему суммируется в строку с GYYYYYYY, а не с PYYYYYYY?)? В общем словами опишите общий алгоритм разбора xml
mirash91, почему в xml две сущности group с кодами GYYYYYYY PYYYYYYY, но сумма атрибутов power из обоих пишется в строку с GYYYYYYY? по какому признаку связаны сущности group и adjacent (почему суммируется в строку с GYYYYYYY, а не с PYYYYYYY?)? В общем словами опишите общий алгоритм разбора xmlkrosav4ig
krosav4ig, спасибо, что откликнулись, проблемы решил. з.ы. файл для примера корявый был сам по себе. з.ы.ы. проблема написания всех атрибутов в одну строку мною и была озвучена) Тему можно закрыть.
krosav4ig, спасибо, что откликнулись, проблемы решил. з.ы. файл для примера корявый был сам по себе. з.ы.ы. проблема написания всех атрибутов в одну строку мною и была озвучена) Тему можно закрыть.mirash91
krosav4ig, но ведь вся бяда в том, что карты у файлов у всех (их много) будут разные, а эксель же может одновременно только с одной картой? Если б одна схема на всех была бы, я бы просто импортировал файлы через стандартный импорт
krosav4ig, но ведь вся бяда в том, что карты у файлов у всех (их много) будут разные, а эксель же может одновременно только с одной картой? Если б одна схема на всех была бы, я бы просто импортировал файлы через стандартный импортmirash91
krosav4ig, структура одинаковая, корневой тэг может отличаться, а от этого пляшет и карта, так ведь? соответственно под каждый файл нужна своя карта
krosav4ig, структура одинаковая, корневой тэг может отличаться, а от этого пляшет и карта, так ведь? соответственно под каждый файл нужна своя картаmirash91
структура одинаковая, корневой тэг может отличаться
Напишите тогда собственную xsd-схему и определите в ней замещение элементов. Правда, тогда придётся прописывать ссылку на схему в каждый xml-файл, скорее всего. Если файлы одной карты, уже загруженной в Excel, то можно в таблицу, ассоциированную со схемой, загружать импортом несколько файлов. Ctrl+A в окне выбора файлов.
Успехов.
Доброе время суток
Цитата
структура одинаковая, корневой тэг может отличаться
Напишите тогда собственную xsd-схему и определите в ней замещение элементов. Правда, тогда придётся прописывать ссылку на схему в каждый xml-файл, скорее всего. Если файлы одной карты, уже загруженной в Excel, то можно в таблицу, ассоциированную со схемой, загружать импортом несколько файлов. Ctrl+A в окне выбора файлов.
anvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимое
anvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимоеkrosav4ig
krosav4ig, спасибо за информацию. Только начинаю "ковырять" это хозяйство. Уже, правда, нарывался на невозможность использовать импортированную схему для последующего экспорта - проверку не проходит - пишет "Ненормированные данные". Тогда для mirash91, учитывая что
Цитата
структура одинаковая, корневой тэг может отличаться
будет лучше через MSXML2.DOMDocument60 считывать содержимое xml-файла, затем получать xml-строку содержимого, менять название корневого тэга на корневой тэг определённый в загруженной карте, а затем воспользоваться методом XmlMap.ImportXml этой карты для импорта этой изменённой строки в таблицу.
Доброе время суток
Цитата
в excel не поддерживается ни замещение,
krosav4ig, спасибо за информацию. Только начинаю "ковырять" это хозяйство. Уже, правда, нарывался на невозможность использовать импортированную схему для последующего экспорта - проверку не проходит - пишет "Ненормированные данные". Тогда для mirash91, учитывая что
Цитата
структура одинаковая, корневой тэг может отличаться
будет лучше через MSXML2.DOMDocument60 считывать содержимое xml-файла, затем получать xml-строку содержимого, менять название корневого тэга на корневой тэг определённый в загруженной карте, а затем воспользоваться методом XmlMap.ImportXml этой карты для импорта этой изменённой строки в таблицу.anvg
на всякий случай набросал пару вариантов решения, предложенного 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]
на всякий случай набросал пару вариантов решения, предложенного 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