Как удалить имена тегов в XML-файле с помощью Perl - PullRequest
1 голос
/ 21 ноября 2011

У меня есть несколько файлов XML в папке, поэтому я написал такой скрипт, чтобы объединить его в один файл XML

#!/usr/bin/perl
use warnings;
use XML::LibXML;
use Carp;
use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;
use Digest::MD5 'md5';

if ( @ARGV == 0 ) {
push @ARGV, "c:/main/work";
warn "Using default path $ARGV[0]\n  Usage: $0  path ...\n";
}

open( my $allxml, '>', "all_xml_contents.combined.xml" )
 or die "can't open output xml file for writing: $!\n";
print $allxml '<?xml version="1.0" encoding="UTF-8"?>',
"\n<Shiporder xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
 my %shipto_md5;
find(
sub {
return unless ( /(_stc\.xml)$/ and -f );
extract_information();
return;
 },
@ARGV
);

print $allxml "</Shiporder>\n";

sub extract_information {
my $path = $_;
 if ( my $reader = XML::LibXML::Reader->new( location => $path )) {
while ( $reader->nextElement( 'data' )) {
    my $elem = $reader->readOuterXml();
    my $md5 = md5( $elem );
    print $allxml $reader->readOuterXml() unless ( $shipto_md5{$md5}++ );
 }
 }
return;
}

Это печатает все файлы XML в один XML, как это.

 all_xml.combined.xml
 <?xml version="1.0" encoding="UTF-8"?>
<student specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <student>
<name>johan</name>
 </student>

<student>
<name>benny</name>
</student>

 <student>
<name>kent</name>
 </student>

 </student specification>

но у меня есть еще одна информация об узле в одном XML-файле, я пытался извлечь эту информацию, например, в цикле while.

    $reader->nextElement( 'details' );
     $information = $reader->readInnerXml();

но как я могу добавить эту информацию в выходной файл, пожалуйста, помогите мне с этой проблемой.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011

Три очевидных момента.

  1. Вы загружаете модуль XML :: LibXML, но не используете его.
  2. Проблематичным объявлением XML всегда является первая строка входных файлов. Так почему бы просто не пропустить первую строку?
  3. Файл, который вы в итоге получите, не будет действительным XML. Документ XML нуждается в единственном корневом элементе. Поэтому вам нужно создать еще один элемент (возможно, ), который будет окружать все данные из других файлов.
2 голосов
/ 21 ноября 2011

Можно ли будет переключиться на XML :: Twig ?Это обеспечивает отличный способ обработки тегов.

Возможно, вам нужно что-то вроде

 my $twig=XML::Twig->new(   
    twig_handlers => 
      { 
        **student with specification** => sub { $_->delete;       },  # remove hidden elements
      },

Вам нужно изменить специалиста, чтобы он работал на вас.Извините, у меня не так много времени, иначе я бы написал полный код.

0 голосов
/ 21 ноября 2011

Вот некоторый код, который делает это, используя DOMDocument ()

За все, 1) Создать родительский документ из строки или аналогичной 2) Загрузите каждый файл, импортируйте и добавьте 3) Сохранить результаты.

Обычно в программировании XML лучше использовать функции синтаксического анализатора XML, чем манипулирование строками.

Удачи.

function loadXMLString( $strXML ) {
    $xmlDoc = new DOMDocument();
    $xmlDoc->formatOutput = true; 
    $xmlDoc->loadXML( $strXML );
    return $xmlDoc;
}

function loadXMLFile( $strFileName, $defaultXML=null ) {
    $xmlDoc = new DOMDocument();
    if( file_exists( $strFileName )  ){
        $xmlDoc->load( $strFileName );
    } else {
        if( $defaultXML == null  ) {
            throw new Exception( "Cannot locate file: " . $strFileName . " no default specified." );
        } else {
            // create it, if default XML is supplied
            return $this->loadXMLString( $defaultXML );
        } 
    }
    return $xmlDoc;
}


$xmlMain = loadXMLString( "<xmlparent/>" );

$xmlChild = loadXMLFile( "test1.xml" );
$ndTemp = $xmlMain->importNode( $xmlChild->documentElement, true );
$xmlMain->documentElement->appendChild( $ndTemp );

$xmlChild = loadXMLFile( "test2.xml" );
$ndTemp = $xmlMain->importNode( $xmlChild->documentElement, true );
$xmlMain->documentElement->appendChild( $ndTemp );

$xmlMain->save( "all.xml" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...