Разбить XML-файл на несколько XML-файлов
Я хочу разбить вывод XML, данный WSMAN, на несколько файлов XML, чтобы можно было проанализировать вывод.
WSMAN дает мне вывод, как показано ниже, который в основном имеет два отдельных файла XML, каждый из которых имеет свой собственный корневой узел:
<?xml version="1.0" encoding="UTF-8"?>
<s:Body>
<wsen:PullResponse>
<wsen:Items>
<n1:DCIM_SoftwareIdentity>
<n1:ComponentType>BIOS</n1:ComponentType>
<n1:InstanceID>DCIM:CURRENT#741__BIOS.Setup.1-1</n1:InstanceID>
<n1:VersionString>1.3.6</n1:VersionString>
</n1:DCIM_SoftwareIdentity>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
<?xml version="1.0" encoding="UTF-8"?>
<s:Body>
<wsen:PullResponse>
<wsen:Items>
<n1:DCIM_SoftwareIdentity>
<n1:ComponentType>BIOS</n1:ComponentType>
<n1:InstanceID>DCIM:INSTALLED#741__BIOS.Setup.1-1</n1:InstanceID>
<n1:VersionString>1.3.6</n1:VersionString>
</n1:DCIM_SoftwareIdentity>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
Я не могу разобрать выше вывод с XML::Simple
как указано выше, вывод содержит 2 корневых элемента, которые являются "мусорными" с точки зрения XML
Вопрос / Заявление:
Я хочу разбить вышеприведенный вывод на два отдельных XML-файла, каждый из которых содержит собственный корневой элемент, как показано ниже:
<?xml version="1.0" encoding="UTF-8"?>
<s:Body>
<wsen:PullResponse>
<wsen:Items>
<n1:DCIM_SoftwareIdentity>
<n1:ComponentType>BIOS</n1:ComponentType>
<n1:InstanceID>DCIM:CURRENT#741__BIOS.Setup.1-1</n1:InstanceID>
<n1:VersionString>1.3.6</n1:VersionString>
</n1:DCIM_SoftwareIdentity>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
......
<?xml version="1.0" encoding="UTF-8"?>
<s:Body>
<wsen:PullResponse>
<wsen:Items>
<n1:DCIM_SoftwareIdentity>
<n1:ComponentType>BIOS</n1:ComponentType>
<n1:InstanceID>DCIM:INSTALLED#741__BIOS.Setup.1-1</n1:InstanceID>
<n1:VersionString>1.3.6</n1:VersionString>
</n1:DCIM_SoftwareIdentity>
</wsen:Items>
</wsen:PullResponse>
</s:Body>
Моя логика:
1) Разбор строки построчно
2) если вы столкнетесь ?xml version
шаблон, затем создайте новый файл XML и напишите ?xml version
строка и дальнейшие строки в этом новом файле, пока вы снова не столкнетесь ?xml version
шаблон.
3) Выполняйте шаг 2 каждый раз, когда вы сталкиваетесь ?xml version
шаблон
Вот мой код:
#!/usr/bin/perl -w
use strict;
use XML::Simple;
use Data::Dumper;
my $counter = 0;
my $fileName;
while (my $line = <DATA>)
{
if ( $line =~ /\?xml version/ )
{
$counter++;
print "Creating the BIOS file \n";
$fileName = "BIOS"."_".$counter;
}
open (my $sub_xml_file, ">" , $fileName) or die "Canot create $fileName: $!\n";
print $sub_xml_file $line;
}
__DATA__
## omitting this part as this contains the XML info listed above.
Теперь мой скрипт создает файлы BIOS_1
а также BIOS_2
но он записывает только последнюю строку из вышеприведенного XML-вывода:
# cat BIOS_1
</s:Body>
# cat BIOS_2
</s:Body>
Можете ли вы помочь мне исправить мой сценарий, чтобы создать два отдельных файла XML...
1 ответ
Вы никогда не сохраняете $line
для будущих проходов петли.
Загрузите все в памяти подход:
my $count;
my $file; { local $/; $file = <>; }
for my $xml (split /^(?=<\?xml)/m, $file) {
my $fn = sprintf("BIOS_%d.xml", ++$count);
open(my $fh, '>', $fn) or die $!;
print $fh $xml;
}
Линия в подходе времени:
my $fh;
my $count;
while (<>) {
if (/^<\?xml/) {
my $fn = sprintf("BIOS_%d.xml", ++$count);
open($fh, '>', $fn) or die $!;
}
print $fh $_;
}