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

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

 #!/usr/bin/perl
 use warnings;
 use strict;
 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/sav ";
     warn "Using default path $ARGV[0]\n  Usage: $0  path ...\n";
 }

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

 print $allxml "</Datainfo>\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 ( $extract_md5{$md5}++ );
         }

     }
     return;
 }

Но из приведенного выше сценария печати XML-файла, как этот

комбинированный.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Datainfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <data>
        <test>22</test>
        <info>sensor value</info>
        <sensor>
            <sensor value="23" temp="25"/>
        </sensor>
    </data>
    <data>
        <test>23</test>
        <info>sensor value</info>
        <sensor>
            <sensor value="24" temp="27"/>
        </sensor>
    </data>
    <data>
        <test>22</test>
        <info>sensor value</info>
        <sensor>
            <sensor value="22" temp="26"/>
        </sensor>
    </data>
</Datainfo>

В вышеXML-файл У меня есть элемент данных test (22), повторяется два раза.Мне нужно использовать тест в качестве элемента для поиска в файле, если найден тот же номер теста, каким всегда может быть информация внутри этого узла, мне нужно удалить всю информацию об этом узле.Я пытался сделать с md5, но он удалял дублирующиеся узлы из файлов allxml, но теперь мне нужно найти один конкретный элемент и удалить всю информацию об узлах, если дубликат произошел. Пожалуйста, помогите мне с этой проблемой.
Вывод, такой как

комбинированный.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Datainfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <data>
        <test>22</test>
        <info>sensor value</info>
        <sensor>
            <sensor value="23" temp="25"/>
        </sensor>
    </data>
    <data>
        <test>23</test>
        <info>sensor value</info>
        <sensor>
            <sensor value="24" temp="27"/>
        </sensor>
    </data>
</Datainfo>

Ответы [ 2 ]

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

Я обычно использую XML :: Simple для подобных вещей.

XML::Simple хранит ваш XML-файл в структуре хэша / массива. Это автоматически устранит проблему с дубликатами, которую вы обнаружите (в зависимости от того, как вы ее настроите).

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

Вам придется выполнить проверку дубликатов, специально проверяя содержимое <test> вместо md5 всего узла.

Например, вместо my $md5 = md5( $elem ); и сохраняя ключ $md5 в хэше, вынеобходимо извлечь содержимое тега <test> и сохранить его.

Я бы предпочел не предоставлять больше подробностей, поскольку вы, похоже, просто рассылаете спам SO, а также PerlMonks с просьбами помочь вам выполнить свою работу и копировать / вставлять несколько сложный код, который вы не пытаетесь понятькак это работает.

http://www.perlmonks.org/?node_id=939272

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...