Perl和XML :: Smart:如何根据节点的值检查节点的存在?

时间:2016-07-11 14:38:15

标签: xml perl

XML :: Smart库(或XML :: LibXML)中的perl函数允许在添加节点之前检查节点是否存在?

示例:

<food>
<fruit>banana</fruit>
<fruit>apple</fruit>
<fruit>orange</fruit>
</food>

我想加水果&#34;香蕉&#34;只有它还没有存在。 感谢。

1 个答案:

答案 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上下文的解析器要好得多。