Как я могу искать и заменять XML на основе значений в хэше Perl? - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть XML-файл в строковой переменной ($data) и хэш, содержащий все имена тегов и их содержимое (%field_list).

Необходимо проверить имена тегов, чтобы, если они являются перечисляемыми полями, их содержимое заменялось строками.

Кто-нибудь знает, возможно ли это сделать с помощью поиска и замены? Сейчас мне не очень везет.

foreach my $field (sort keys %field_list)
{ 
    my $value = $field_list{$field};
    # will return a non-empty string if field is enumerated and value is valid
    my $enum_string = &convert_enumeration_to_string($field, $value);
    if ($enum_string ne "")
    {
#syntax error
$data =~ s/<($field)>($value)</($field)>/<($field)>($enum_string)</($field)>/g;
    }
} 

Кто-нибудь знает, могу ли я что-то сделать или мне нужен совершенно другой подход?

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

убеги от косой черты:

$data =~ s/<($field)>($value)<\/($field)>/<($field)>($enum_string)<\/($field)>/g;

Или используйте разные разделители:

$data =~ s{<($field)>($value)</($field)>}{<($field)>($enum_string)</($field)>}g;
1 голос
/ 19 ноября 2009

Хорошо, давайте перейдем к победе XML: используйте XML-библиотеку наподобие XML :: LibXML для управления документами XML.

use XML::LibXML;
my $dom = XML::LibXML->load_xml(string => $data);

foreach my $field (sort keys %field_list) {
    my $value = $field_list{$field};
    if (my $enum_string = &convert_enumeration_to_string($field, $value)) {
        foreach my $node ($dom->findnodes("//xml/${field}[. = '$value']")
            ->get_nodelist) {
            my $element = $dom->createElement($field);
            $element->appendText($enum_string);
            $node->replaceNode($element);
        }
    }
}

print $dom->toString;
0 голосов
/ 18 ноября 2009

Правильный способ сделать это:

$data =~ s/<($field)>($value)<\/($field)>/<$field>$enum_string<\/$field>/g; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...