【问题标题】:perl xml parser get xml content within xmlperl xml解析器获取xml中的xml内容
【发布时间】:2011-06-23 23:46:44
【问题描述】:

如何使用 XMLParser 获取 item->@url、item->@replace 和 item->"value inside" 将内容作为节点的字符串 item->@cone="one"?

<cstep>
  <item  cone="one" 
         url="http://google.com/{ccc}/cthree"
         replace="{ccc}">
            <itemsub conesub="conesub">
                    <itemsubsub  conesubsub="conesubsub" />
            </itemsub>       
  </item>
  <item  cone="two" 
         url="http://google.com/{ccc}/cthree"
         replace="{ccc}">
            <itemsub conesub="conesub">
                    <itemsubsub  conesubsub="conesubsub" />
            </itemsub>       
  </item>
</cstep>

【问题讨论】:

  • 基本上我试图将整个 itemsub 节点作为字符串获取

标签: xml perl


【解决方案1】:

XML::Twig:

use warnings;
use strict;
use XML::Twig;

my $str = <<EOF;
    <cstep>
      <item  cone="one" 
             url="http://google.com/{ccc}/cthree"
             replace="{ccc}">
                <itemsub conesub="conesub">
                        <itemsubsub  conesubsub="conesubsub" />
                </itemsub>       
      </item>
      <item  cone="two" 
             url="http://google.com/{ccc}/cthree"
             replace="{ccc}">
                <itemsub conesub="conesub">
                        <itemsubsub  conesubsub="conesubsub" />
                </itemsub>       
      </item>
    </cstep>
EOF

my $t = XML::Twig->new(twig_handlers => {'cstep/item' => \&item });
$t->parse($str);

sub item {
    my ($t, $item) = @_;
    if ($item->att('cone') eq 'one') {
        print $item->att('url'    ), "\n";
        print $item->att('replace'), "\n";
    }
}

__END__

http://google.com/{ccc}/cthree
{ccc}

更新:回答 cmets 中关于在子外部分配给 $url 的问题:

my $t = XML::Twig->new(twig_handlers => {'cstep/item' => \&item });
my $url;
$t->parse($str);
print "$url\n";

sub item {
    my ($t, $item) = @_;
    if ($item->att('cone') eq 'one') {
        $url = $item->att('url');
        print $item->att('replace'), "\n";
    }
}

【讨论】:

  • 太棒了,谢谢!如何将内容(基本上是整个节点 itemsub)作为字符串获取?
  • 不客气。使用children 方法,如文档中所示。
  • @user391986 获取itemsub 的字符串,使用my $itemsub= $item-&gt;first_child( 'itemsub')-&gt;xml_string;
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 2013-07-24
  • 2011-08-08
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多