внести изменения в XML-файл в Perl - PullRequest
0 голосов
/ 22 мая 2018

У меня есть этот xml-файл test1.xml:

<body>
    <message>
        <name>gandalf</name>
        <attributes>
            <value key="1">1</value>
            <value key="2">2</value>
            <value key="3">3</value>
            <value key="4">4</value>
        </attributes>
    </message>
</body>

Я хочу переопределить значение этого ключа от "4" до "10", поэтому мой xml будет выглядеть так:

<body>
    <message>
        <name>gandalf</name>
        <attributes>
            <value key="1">1</value>
            <value key="2">2</value>
            <value key="3">3</value>
            <value key="4">10</value>
        </attributes>
    </message>
</body>

это мой код:

#!/usr/bin/perl

use XML::Simple;

my $xml = new XML::Simple;
my $data = XMLin("test1.xml", ForceArray => 1);
$data->{message}->[0]->{attributes}->[0]->{value}->{4}->{content} = "10";
$newData = $xml->XMLout($data);
open(XML,">test2.xml");
print XML $newData;
close(XML);

когда я запускаю этот код, выходной XML выглядит следующим образом:

<opt>
    <message>
        <name>gandalf</name>
        <attributes name="value">
            <1>1<1>
            <2>2<2>
            <3>3<3>
            <4>10<4>
        </attributes>
    </message>
</opt>

1 Ответ

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

Не используйте XML::Simple.

XML::LibXML и XML::Twig - гораздо лучшие альтернативы.

Вот решение с использованием XML :: Twig:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $xml = XML::Twig -> new -> parsefile ( 'test1.xml' );
$_ -> set_text('10') for $xml -> get_xpath('//message/attributes/value[@key="4"]');
$xml -> set_pretty_print('indented');

$xml -> print;

Это дает вам:

<body>
  <message>
    <name>gandalf</name>
    <attributes>
      <value key="1">1</value>
      <value key="2">2</value>
      <value key="3">3</value>
      <value key="4">10</value>
    </attributes>
  </message>
</body>

Вы можете печатать в файл, открыв дескриптор файла и указав для этого fh какаргумент print:

open ( my $ouput, '>', 'test2.xml' ) or die $!;
$xml -> print ( $output );

Поскольку вы также спрашиваете в комментариях:

Я также хочу знать, как установить текст для значения с ключом, который не существует,Например, я хочу добавить <value key="5">5</value> внутри атрибутов

my $attributes = $xml -> get_xpath('//message/attributes',0); #0 to find the first one. 
$attributes -> insert_new_elt('last_child', 'value', { key => 5 }, 5 );

или одной строкой:

$xml -> get_xpath('//message/attributes',0) -> insert_new_elt('last_child', 'value', { key => 5 }, 5 );

Обратите внимание на немного другое использование get_xpath - мы даемвторой аргумент 0 - потому что он говорит «получите первый соответствующий элемент», а не каждый соответствующий элемент.

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