如何根据Perl哈希中的值搜索和替换XML?

时间:2009-11-18 15:34:48

标签: xml perl replace

我在字符串变量($data)中有一个XML文件,以及一个包含所有标记名称及其内容(%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 个答案:

答案 0 :(得分:3)

逃避斜线:

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

或者使用不同的分隔符:

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

答案 1 :(得分:1)

好吧,让我们跳进XML的潮流:使用像XML::LibXML这样的XML库来操作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;

答案 2 :(得分:0)

正确的做法是:

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