Что нового

Объеденить архив XML файлов в 1 файл

Tyr

Новичок
Сообщения
43
Репутация
4
Возникла задача объединить XML Файлы в один для последующей обработки(думаю открыть в Экселе, он создаст структуру, там упорядочу как надо и сохраню в текстовик - может не оптимально, но мне показалось это наиболее быстрым способом чем вникать в структуру).
Сделал объединение файлов таким вот скриптом:
Код:
$sPath = 'd:\test inp.zip\ed101'
$search = FileFindFirstFile($sPath & '\*.content')

$sContent = ''
While 1
    $sFile = FileFindNextFile($search)
    If @error Then ExitLoop
    $sContent &= FileRead($sPath & '\' & $sFile) & @CRLF
WEnd

FileWrite($sPath & '\' & 'summary.content', $sContent)


файлы слились в один весом 300 мегов, но для открытия его в Экселе нужно что бы он воспринимался как единый XML, а для этого нужно удалить из файла структуры начала и конца XML: [box title=TitleBox]<?xml version="1.0" encoding="WINDOWS-1251"?>
<PacketEPD xmlns="urn:cbr-ru:ed:v2.0" EDNo="1" EDDate="2015-10-10" EDAuthor="4660999000" EDQuantity="99" Sum="9999999999" SystemCode="02">
.....</PacketEPD>

Выделено, то что нужно удалять, а то, что "..." между тегами - это должно остаться.
[/box]
Разумеется Sum каждый раз разной длины и поэтому по количеству символов справа обрезать не получится.
Я так понимаю нужно использовать
Код:
StringRegExp и StringRegExpReplace
, но никак не получается с ними разобраться... Может кто поможет?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я бы делал три замены вот так:
Код:
$data = StringRegExpReplace($data,'<\?xml.*?>\r?\n?','')
$data = StringRegExpReplace($data,'<PacketEPD xmlns.*?>','')
$data = StringReplace($data,'</PacketEPD>','')

$data - это содержимое файла откуда нужно вырезать
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
inververs,
Код:
$sFile = FileRead('D:\TEST INP.ZIP\ED101\summary.content')

$sContent = ''
$sContent = StringRegExpReplace($sFile,'<PacketEPD xmlns.*?>','')
$sContent = StringRegExpReplace($sContent,'<\?xml.*?>\r?\n?','')
$sContent = StringReplace($sContent,'</PacketEPD>','')
FileWrite('D:\TEST INP.ZIP\TEST\2summary.content', $sContent)

Работает, но очень долго.
Вероятнее лучше делать не 3 замены, а поиск фрагмента между блоками [box title=TitleBox]<PacketEPD xmlns="urn:cbr-ru:ed:v2.0" EDNo="1" EDDate="2015-10-10" EDAuthor="4660999000" EDQuantity="99" Sum="9999999999" SystemCode="02">[/box] и [box title=TitleBox]</PacketEPD>[/box]
и запись найденного в файл... так хоть 1 поис и 1 проход по файлу.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Tyr
Прикрепите пару XML файлов, которые нужно объединить.


Добавлено:
Сообщение автоматически объединено:

Как вариант можно так:
Код:
Local $oDoc1 = ObjCreate('MSXML2.DOMDocument')
Local $oDoc2 = ObjCreate('MSXML2.DOMDocument')
$oDoc1.ValidateOnParse = True
$oDoc2.ValidateOnParse = True

#Region XML 1
$sDoc_1 = _
'<?xml version="1.0"?>' _
&'<root>' _
	&'<item>' _
		&'<date>01.01.2014</date>' _
		&'<description>Новый Год!</description>' _
	&'</item>' _
	&'<item>' _
		&'<date>06.02.2014</date>' _
		&'<description>Рождество Христово!</description>' _
	&'</item>' _
&'</root>'
#EndRegion XML 1

#Region XML 2
$sDoc_2 = _
'<?xml version="1.0"?>' _
&'<root>' _
	&'<item>' _
		&'<date>23.02.2014</date>' _
		&'<description>День защитника отечества!</description>' _
	&'</item>' _
	&'<item>' _
		&'<date>09.05.2014</date>' _
		&'<description>День Победы!</description>' _
	&'</item>' _
&'</root>'
#EndRegion XML 2

;~ $oDoc1.Load("doc_1.xml")
$oDoc1.LoadXML($sDoc_1)
;~ $oDoc2.Load("doc_2.xml")
$oDoc2.LoadXML($sDoc_2)

For $oDoc2Node In $oDoc2.documentElement.childNodes
  $oDoc1.documentElement.appendChild($oDoc2Node)
Next

ConsoleWrite($oDoc1.xml & @CRLF)
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Garrett

Приложил 3 коротких файлика(это исходные нужные файлы, до слияния их в один). На самом деле в основном они более длинные, но в этих есть полная структура.

Ранее как писал исключил все лишние, потом нужные слил в один файл, последовательно одна ХML за другой. В конечном результате нужно получить текстовый файл таблицу со всёроавно каким разделителем между значениями т.к. в БД разделитель настроить можно, а вот с XML в чистом виде труднее.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Tyr [?]
Возникла задача объединить XML Файлы в один для последующей обработки
Код:
#cs =======================
	Union of all XML files
#ce =======================
Local $sPath = @ScriptDir & '\xml\' ; путь где лежат ваши xml файлы (файл на выходе будет создан здесь же)
Local $sOutputFile = 'all.xml' ; имя файла на выходе
Local $oDoc1 = ObjCreate('MSXML2.DOMDocument')
Local $oDoc2 = ObjCreate('MSXML2.DOMDocument')

$oDoc1.Async = False
$oDoc2.Async = False

$oDoc1.ValidateOnParse = True
$oDoc2.ValidateOnParse = True

$oInstruction = $oDoc1.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"')
$oDoc1.AppendChild($oInstruction)
$oPacketEPD = $oDoc1.CreateElement('PacketEPD');
$oDoc1.AppendChild($oPacketEPD)
$oPacketEPD.Text = @CRLF & @TAB

$hSearch = FileFindFirstFile($sPath & '*.xml')
If $hSearch = -1 Then
    MsgBox(16, @ScriptName, "XML files not found!")
    Exit
EndIf

While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
		
	$oDoc2.Load($sPath & $sFile)
	For $oDoc2Node In $oDoc2.documentElement.childNodes
	  $oDoc1.documentElement.appendChild($oDoc2Node)
	Next
WEnd

FileClose($hSearch)

$oDoc1.Save($sPath & $sOutputFile) ; запись в файл

$oDoc1 = 0
$oDoc2 = 0


в БД разделитель настроить можно, а вот с XML в чистом виде труднее.
В чём собственно трудность? Разбирайте XML и полученные значения записывайте в DB.
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Garrett
Спасибо
OffTopic:
Проблема в том как его разобрать(этот XML). Но это к теме не относится. Тема решена. К сожалению объем файла на выходе получается огромный
 
Верх