XML :: Smart库(或XML :: LibXML)中的perl函数允许在添加节点之前检查节点是否存在?
示例:
<food>
<fruit>banana</fruit>
<fruit>apple</fruit>
<fruit>orange</fruit>
</food>
我想加水果&#34;香蕉&#34;只有它还没有存在。 感谢。
答案 0 :(得分:0)
我不了解XML::Smart
,但在XML::LibXML
中您想要查找节目&#39;。
E.g。
#!/usr/bin/env perl
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML -> new() -> parse_string( do { local $/; <DATA> } );
if ( my $node = $xml -> findnodes ( '//fruit[string()="banana"]') ) {
print $node;
}
else {
#insert new element
my $new = XML::LibXML::Element->new("fruit");
$new -> addChild (XML::LibXML::Text->new("banana"));
$xml -> documentElement -> addChild ( $new );
}
__DATA__
<food>
<fruit>banana</fruit>
<fruit>apple</fruit>
<fruit>orange</fruit>
</food>
编辑:你在评论中提到“grep&#39;可以使用。因此,我强烈建议您不要将上述XML重新格式化为(完全合法地,作为XML规范的一部分):
<food>
<fruit>banana</fruit>
<fruit>apple</fruit>
<fruit>orange</fruit>
</food>
<food
><fruit
>banana</fruit><fruit
>apple</fruit><fruit
>orange</fruit></food>
<food><fruit>banana</fruit><fruit>apple</fruit><fruit>orange</fruit></food>
所有这些在语义上都是相同的。还有许多其他的东西 - 比如标签和属性的排序 - 也会导致正则表达式的严重悲伤。使用理解XML上下文的解析器要好得多。