Как создать один XML-файл из нескольких XML-файлов в каталоге, используя Perl - PullRequest
2 голосов
/ 18 ноября 2011

Привет всем,
Пожалуйста, извините, если есть какие-то грамматические ошибки.
У меня есть несколько XML-файлов в одном каталоге, мне нужно создать несколько XML-файлов в одном XML-файле. Примеры файлов, как это

  file1:bvr.xml

<?xml version="1.0" encoding="UTF-8"?>
<specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <details>
 <name>johan</name>
 <address>Langgt 23</address>
  ---more info---
 </details>
</specification>

 file2:kvr.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <details>
 <name>venu</name>
 ---more info---
 </details>
 </specification>

   file3:svr.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <details>
 <name>kent</name>
 ---more info----
  </details>
  </specification>

  file4:tvr.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <definition>
 <name>kent</name>
  ----more info---
  </definition>
  </specification>

Мне нужно создать один XML-файл, подобный этому.

       new.xml 

<?xml version="1.0" encoding="UTF-8"?>
<specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <details>
 <name>johan</name>
 <address>Langgt 23</address>
  --more info--
 </details>

 <details>
 <name>venu</name>
 ---more info----
 </details>

 <details>
 <name>kent</name>
 <address>vadrss 25</address>
 ---more info--
  </details>

   <definition>
 <name>kent</name>
  ----more info----
  </definition>
</specification>

Я пытался так, но у меня есть некоторые проблемы с этим сценарием.

#!/usr/bin/perl
  use warnings;
  use strict;
 use File::Find;
   use XML::LibXML::Reader;
 use Data::Dumper;
  my $Number;

  my $dir="C:/file/sav";
  find(\&wanted, $dir);
  sub wanted() {
       if ( -f and /(\.xml)$/) {# find all the files with a suffix of .xml

  my $reader = XML::LibXML::Reader->new( location =>$_ )
 or die "cannot read file.xml\n";

    while ($reader->nextElement( 'details' ) ){

          $Number = $reader->readOuterXml();

          print "$Number\n";    
             } 

         }
   return;                   
  }

но у меня есть две проблемы в этом скрипте

1) Я извлекаю информацию из всех XML-файлов, имеющих элемент Node «details», но в одном XML-файле у меня есть данные с другим «определением» элемента Node. Я не извлекаю эту информацию, Что мне делать, если я хочу извлечь эту информацию и сохранить в той же переменной.

2) После извлечения всей информации, хранящейся в переменной $Number, я хочу сохранить информацию о переменной $Number в одном файле XML, как я могу это сделать. Пожалуйста, помогите мне. Я очень плохо знаком с Perl.

                    (or)

Существуют ли другие способы объединения данных всех файлов XML в один файл XML.

После того как вы попробовали свой код, как вы сказали, он дает еще несколько ошибок

#!/usr/bin/perl
use warnings;
use strict;
  use XML::LibXML;
my @xml_files = glob '*.xml';
my $bigXML = XML::LibXML::Document->new( '1.0', 'UTF-8');
my $aggregated; for my $xml_file ( @xml_files ) {

my $doc = XML::LibXML->new->parse_file( $xml_file );

my ( $specNode ) = $doc->findnodes( '//Specification' );

  if ( $aggregated ) {
 $aggregated = $specNode;
 }
 else {
 my @details = $specNode->findnodes( './details' );
 $aggregated->addChild( $_ ) foreach @details;
 }
  }
  $bigXML->adoptNode( $aggregated ); 
 $bigXML->toFile( 'aggregated_data.xml' );

выдает ту же ошибку, что я просил до can't call method "findnodes" on an undefined value, я пытался заменить точку с косой чертой в строке с подробностями, и это выдает ту же ошибку.

и если попытаться использовать функцию golb, как это

my @xml_files = glob '*dtc.xml';

в приведенном выше коде на этот раз выдает другую ошибку, такую ​​как

XML::LibXML::Document::adoptNode()-- Node is not a blessed SV reference at line 21

Я борюсь с этими ошибками, потому что это очень новый модуль для меня, а также я изучил этот документ, все в правильном формате, но я не могу понять эти ошибки. Я очень новичок в этом Perl, может помочь мне.

1 Ответ

1 голос
/ 19 ноября 2011

Прежде всего, спасибо вам за то, что вы опубликовали здесь свои усилия и за то, что вы в конечном итоге захотите сделать то, что объединяет все XML-файлы в один файл.

Для решения проблем:

  1. use strict; use warnings;

    Для выявления глупых ошибок и обеспечения надлежащей обработки ошибок

  2. use XML::LibXML;

    Использованиеваш анализатор

  3. my @xml_files = glob '*.xml';

    Найти все файлы XML в вашем каталоге

  4. my $bigXML = XML::LibXML::Document->new( '1.0', 'UTF-8');

    Создание большого XML-файла, в котором будут храниться все узлы.

  5. Зацикливание каждого файла, получение узла и помещение узла в агрегированный узел

    my $ aggregated;для моего $ xml_file (@xml_files) {

    my $doc = XML::LibXML->new->parse_file( $xml_file );
    
    my ( $specNode ) = $doc->findnodes( '//specification' );
    
    if ( ! $aggregated ) {        # Initialize if doesn't exist
    
        $aggregated = $specNode;
    }
    
    else {                        # Add more <details>
    
        my @details = $specNode->findnodes( './details' );
        $aggregated->addChild( $_ ) foreach @details;
    }
    

    }

  6. Добавьте узел $aggregated в документ $bigXML и напечатайте:

    $bigXML->addChild( $aggregated ); $bigXML->toFile( 'aggregated_data.xml' );

...