亲爱的 Perl 和 XML 大师
我的任务是使用XPath更新XML文件中的值。
我使用Perl中的库来读取、更改和保存 XML 文件:XML::LibXML
# Read XML file
my $parser = XML::LibXML->new();
my $doc = $parser->load_xml(location => $config_file);
my $root = $doc->documentElement();
# Alter nodes\attributes
foreach (keys %environment_values) {
my @nodes = $root->findnodes($_);
if (scalar @nodes < 1) {
print "ERROR: element not found in $config_file by XPath: $_\n";
die;
} elsif (scalar @nodes > 1) {
print "ERROR: more than 1 element (" . scalar @nodes . ") is found in $config_file by XPath: $_\n";
die;
}
my $node = $nodes[0];
if ($node->nodeType == XML_ELEMENT_NODE) {
$node->removeChildNodes();
$node->appendText($environment_values{$_});
} elsif ($node->nodeType == XML_ATTRIBUTE_NODE) {
$node->setValue($environment_values{$_});
} else {
print "ERROR: unknown node type: " . $node->nodeType . "\n";
die;
}
}
# Save the resulting XML file
open (my $fh, '>:raw', $config_file) or die $!;
print $fh $doc->toString();
close $fh;
尽管它生成的文件与原始文件非常相似,但仍然存在一些麻烦:
- 换行符(行尾)是 Unix 风格的,虽然原始文件有它们在 Windows 风格。
- 关闭 /> 之前的空格被删除,例如
<node />
变为<node/>
.
有机会解决这些问题吗?我希望得到与原始文件完全相同的 XML 文件,唯一的区别是我正在修改的属性值......
PS 我真的很喜欢<xmlpoke>
NAnt 的简单性。但是必须使用 Perl 来完成这项工作。