Perl-скрипт для заполнения XML-файла - PullRequest
1 голос
/ 29 ноября 2010

Я работаю над сценарием Perl, который должен заполнять XML-файл на основе пользовательского ввода.Пользователь предоставит название страны и название города.Если он / она предоставляет: japan и e, мне нужно заполнить это в теге japan - но в качестве последней записи.Как лучше всего этого добиться?Города в теге страны могут быть много.Как я могу добавить город в качестве последнего тега внутри соответствующего тега страны?

Как я могу указывать в конце соответствующего тега страны каждый раз, когда мне нужно добавить город?

PS: IЯ не использую встроенные структуры данных для хранения данных.Я просто добавляю немые строки в файл.

Выходной файл XML Samlple:

<country name="japan-">
  <city>a</city>
  <city>b</city>
  <city>c</city>
  <city>d</city>
</country>
<country name="china-">
  <city>aa</city>
  <city>bb</city>
  <city>cc</city>
  <city>dd</city>
</country>

У меня есть более конкретный вопрос, Изменить содержимое файла XML с помощьюPerl скрипт .

Ответы [ 3 ]

4 голосов
/ 29 ноября 2010

XML :: Simple - это ... Simple.:) Требуется корневой элемент:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Simple;
use Data::Dumper;

my $xml = join "\n", <DATA>;
my $doc = XMLin($xml, KeepRoot => 1);

# Get the list of cities as a list, then push "Tokyo" to it.
push @{$doc->{countries}->{country}->{'japan-'}->{city}}, 'Tokyo';

print XMLout($doc, KeepRoot => 1);

__DATA__
<countries>
    <country name="japan-">
        <city>a</city>
        <city>b</city>
        <city>c</city>
        <city>d</city>
    </country>
    <country name="china-">
        <city>aa</city>
        <city>bb</city>
        <city>cc</city>
        <city>dd</city>
    </country>
</countries>

Вывод:

<countries>
  <country name="china-">
    <city>aa</city>
    <city>bb</city>
    <city>cc</city>
    <city>dd</city>
  </country>
  <country name="japan-">
    <city>a</city>
    <city>b</city>
    <city>c</city>
    <city>d</city>
    <city>Tokyo</city>
  </country>
</countries>
0 голосов
/ 29 ноября 2010

Ниже приведено решение с использованием XML :: Twig . Я думаю, что он делает то, что вы хотите. Наиболее примечательные особенности XML :: Twig, которые он использует, - это использование опции id => name для обработки атрибута имени как идентификатора, чтобы элементы можно было найти непосредственно с помощью $t->elt_id, и метод insert_new_elt для создания нового элемента в дерево. Его подпись (<position: before, after, first_child or last_child>, <tag_name>, <{attributes}>, <content>),

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t= XML::Twig->new( id => 'name',  # treat the name attribute as an ID
                       pretty_print => 'indented'
                     )
                ->parse( \*DATA);

add_city( $t, japan => "Kobe");
add_city( $t, japan => "Tokyo");
add_city( $t, china => "Beijing");
add_city( $t, china => "Shanghai");
add_city( $t, japan => "Kobe");
add_city( $t, south_korea => "Seoul");

$t->print;

sub add_city
  { my( $t, $country_name, $city_name)= @_;

    my $country= $t->elt_id( $country_name);
    if( ! $country)
      { warn "creating country '$country_name'\n"; 
        $country= $t->root->insert_new_elt( last_child => country 
                                            => { name => $country_name }
                                          );
      }

    if( $country->first_child( qq{city[text()="$city_name"]}))
      { warn "city '$city_name' already found in '$country_name', skipping\n"; 
        return;
      }

    warn "adding '$city_name' to '$country_name', skipping\n";
    $country->insert_new_elt( last_child => 'city', $city_name);
  }


__DATA__
<countries>
  <country name="japan">
  </country>
  <country name="china">
  </country>
</countries>
0 голосов
/ 29 ноября 2010

Я думаю, вы имели в виду: как мне загрузить XML-файл и добавить в него записи на основе пользовательского ввода?

Если я правильно понял: вы используете синтаксический анализатор / средство записи, например XML :: Simpleпо-видимому, они лучше, чем XML :: Twig, поэтому рассмотрим немного), чтобы загрузить файл в структуру данных Perl, состоящую из хэшей и массивов.(Используйте Data :: Dumper, чтобы проверить, как это выглядит в памяти.) Затем вы редактируете эту структуру с обычным взаимодействием с данными Perl, а когда закончите, используйте средство записи, чтобы преобразовать ее обратно в XML.

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