我在字符串变量($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;
}
}
有人知道我能做什么,或者我需要一种完全不同的方法吗?
答案 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;