XML :: Twig изменяет текст нескольких элементов - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь изменить текст трех элементов из исходного XML-файла.

Две цели имеют одинаковое имя элемента (ifw6:value), но существуют под разными заголовками.Третий имеет имя элемента, отличное от первых двух.

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

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $text1 = "123456789";
my $text2 = "1234567";
my $text3 = "001";

my $twig = XML::Twig->new(
     pretty_print => 'indented',
     twig_handlers => {

         text => sub {

             my $targ1_2 = $_->next_elt('ifw6:value');
             my $targ3   = $_->next_elt('ifw4:relationship');

             if ($targ1_2->text eq 'target1') {
                 $targ1_2->set_text($text1);
             }

             if ($targ1_2->text eq 'target2') {
                 $targ1_2->set_text($text2);
             }

             if ($targ3->text eq 'target3') {
                 $targ3->set_text($text3);
             }

             $targ1_2->flush;
             $targ3->flush;
         }
    }
);


$twig->parsefile('text.xml');
$twig->print();

text.xml

<SOAP-ENV>
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ifw:Information>
         <requestHeader>
            <ifw1:id/>
         </requestHeader>
         <ifw4:Miscellaneous>
            <ifw6:MiscVals xsi:type="type1">
               <ifw6:value>target1</ifw6:value>
            </ifw6:MiscVals>
            <ifw6:MiscVals xsi:type="type2">
              <ifw6:Vals xsi:type="type3">
                  <ifw6:value>target2</ifw6:value>
              </ifw6:Vals>
           </ifw6:MiscVals>
              <ifw4:relationship>target3</ifw4:relationship>
           </ifw4:Miscellaneous>
        </ifw:Information>
      </SOAP-ENV:Body>
</SOAP-ENV>

желаемый результат

<SOAP-ENV>
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ifw:Information>
         <requestHeader>
            <ifw1:id/>
         </requestHeader>
         <ifw4:Miscellaneous>
            <ifw6:MiscVals xsi:type="type1">
               <ifw6:value>123456789</ifw6:value>
            </ifw6:MiscVals>
            <ifw6:MiscVals xsi:type="type2">
              <ifw6:Vals xsi:type="type3">
                  <ifw6:value>1234567</ifw6:value>
              </ifw6:Vals>
           </ifw6:MiscVals>
              <ifw4:relationship>001</ifw4:relationship>
           </ifw4:Miscellaneous>
        </ifw:Information>
      </SOAP-ENV:Body>
</SOAP-ENV>

Ответы [ 2 ]

0 голосов
/ 29 мая 2018
use strict;
use warnings;
use XML::Twig;

my $text1 = "123456789";
my $text2 = "12345678901011121314151";
my $text3 = "001";

my $twig = XML::Twig->new(
    pretty_print => 'indented',
    twig_handlers => {
        'ifw6:value[string()="target1"]' => sub {
            $_->set_text($text1);
        },
        'ifw6:value[string()="target2"]' => sub {
            $_->set_text($text2);
        },
        'ifw4:relationship[string()="target3"]' => sub {
            $_->set_text($text3);
        }
    }
);

$twig->parsefile('text.xml');
$twig->print();

Использование flush сделало для меня странные вещи, я не уверен, что это совершенно необходимо.Я думаю, что вы хотели получить результат target2 замена отсутствует часть строки.

0 голосов
/ 29 мая 2018

Я думаю, что это должно работать, но у меня нет возможности проверить это в настоящее время

my $twig = XML::Twig->new(

     pretty_print => 'indented',

     twig_handlers => {

         'ifw6:value' => sub {

             my $text = $_->trimmed_text;

             if ($text eq 'target1') {
                 $_->set_text($text1);
             }
             elsif ($text eq 'target2') {
                 $_->set_text($text2);
             }

             $_->flush;
         },

         'ifw4:relationship' => sub {

             my $text = $_->trimmed_text;

             if ($text eq 'target3') {
                 $_->set_text($text3);
             }

             $_->flush;
         }
    }

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