【问题标题】:Get the parent tag along with its position using XML::Smart in perl在 perl 中使用 XML::Smart 获取父标签及其位置
【发布时间】:2013-12-04 04:42:34
【问题描述】:

我有一个类似这样的 XML。

my $XML='<?xml version="1.0" encoding="ISO-8859-1"?>
<TEST>
  <PERSON name="Melissa">
    <PET type="carnivorous">Cat</PET>
    <PET>Dog</PET>
    <AGE>24</AGE>
    <CAR>Y</CAR>
  </PERSON>
  <PERSON name="Thomas">
    <PET type="herbivorous">cow</PET>
    <AGE>28</AGE>
    <CAR>N</CAR>
  </PERSON>
</TEST>
';

这就是我想要的结果。

my $XML='<?xml version="1.0" encoding="ISO-8859-1"?>
<TEST>
  <PERSON name="Melissa">
    <PET type="carnivorous">Cat</PET>
    <PET>Dog</PET>
    <AGE>24</AGE>
    <CAR>Y</CAR>
  </PERSON>
  <PERSON name="Thomas">
    <PET type="herbivorous">cow</PET>
    <PET type="herbivorous">goat</PET>
    <AGE>28</AGE>
    <CAR>N</CAR>
  </PERSON>
</TEST>
';

我要遵循的步骤是:

1.搜索“草食性”类型的标签

my $test_data = XML::Smart->new($XML);
my $Parent_pos=$test_data->{TEST}{PERSON}{PET}('type','eq','herbivorous');
my $new_tag= { type =>"herbivorous" };

2.如何插入新标签“山羊”??我想得到“牛”的父母,并插入一个新标签,但我想不出办法。

请帮忙!

【问题讨论】:

    标签: xml perl xml-parsing libxml2


    【解决方案1】:

    您不能同时在多个元素中进行搜索。如果你写

    $test_data->{TEST}{PERSON}{PET}('type', 'eq', 'herbivorous')
    

    您正在查看TEST 中的first PERSON 元素,该元素没有草食性宠物,因此您会返回一个空集合。相反,您必须遍历所有 PERSON 元素才能找到拥有草食性宠物的元素。

    此代码查看每个PERSON,如果他们已经有一只草食性宠物,则将一头草食性大象添加到他们的宠物列表的末尾。

    my $test_data = XML::Smart->new($XML);
    my $people = $test_data->{TEST}{PERSON};
    
    for my $person (@$people) {
      my $pets = $person->{PET};
      if ($pets->(qw/ type eq herbivorous /)) {
        push @$pets, { type => 'herbivorous', CONTENT => 'elephant'};
      }
    }
    
    print scalar $test_data->data(nometagen => 1);
    

    输出

    <?xml version="1.0" encoding="utf-8" ?>
    <TEST>
      <PERSON name="Melissa">
        <PET type="carnivorous">Cat</PET>
        <PET>Dog</PET>
        <AGE>24</AGE>
        <CAR>Y</CAR>
      </PERSON>
      <PERSON name="Thomas">
        <PET type="herbivorous">cow</PET>
        <PET type="herbivorous">elephant</PET>
        <AGE>28</AGE>
        <CAR>N</CAR>
      </PERSON>
    </TEST>
    

    【讨论】:

    • 就是这样! :) 谢谢! :)
    • @user2179627:不客气。请注意,我稍微更改了print 语句。在列表上下文中,$xml-&gt;data 返回一个 scond 参数,它是一个标志,指示数据是否为 ​​Unicode 文本。因此,您需要添加scalar 以避免在XML 之后打印虚假的1。另外,您可能不希望XML::Smart 默认创建的&lt;?meta name="GENERATOR" ?&gt; 内容,因此您还需要添加nometagen =&gt; 1 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多