-4

我是新的 XML-Twig...我想要拆分 para 标记....

XML 文件:

<xml>
   <p class="indent">text <i>text<i> incluce <div>text</div> ateas</p>
   <p class="text">text text incluce <div>text</div> <b>ateas<b></p>
   <p class="text">text <p>text</p> incluce <div>text</div> ateas</p>
</xml>

在这里,我想要拆分 Para 标签。我如何拆分以及如何在没有内联 para 标签和 div 标签的情况下分配 para 标签...

我需要输出为:

<xml>
<p class="indent">text <i>text</i> incluce</p>
<div>text</div>
<p class="indent">ateas</p>
<p class="text">text text incluce</p>
<div>text</div>
<p class="text"><b>ateas</b></p>
<p class="text">text</p>
<p>text</p>
<p class="text">incluce</p>
<div>text</div>
<p class="text">ateas</p>
</xml>

这个怎么分啊。。。。

脚本:

#!/usr/bin/perl
use warnings;
use strict;
use XML::Twig;
open(my $output , '>', "output.xml") || die "can't open the Output $!\n";
my $xml = XML::Twig->new( twig_handlers => { p => \&split_tag } );
$xml->parsefile("sample.xml");
$xml->print($output);
sub split_tag {
my ($twig, $p) = @_;
$_->wrap_in('p', $p->atts) for $p->children('#TEXT');
$p->erase;
}

但我无法获得提取输出.. 我该怎么做?

4

1 回答 1

2

此代码似乎符合您的新要求。如果这不起作用,在请求更多免费代码之前尝试自己修复它。

我忽略了示例数据的第三行,因为嵌套<p>元素在 HTML 中是非法的。

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
  twig_handlers => { p => \&split },
  pretty_print => 'indented',
);

$twig ->parsefile('sample.xml');
$twig->print_to_file('output.xml');

sub split{
  my ($twig, $p) = @_;
  return if $p->contains_only_text;

  my @children = $p->cut_children;
  my @newchildren;

  my $newpara = $p->copy;
  for my $child (@children) {
    if ($child->is_elt and $child->tag eq 'div') {
      push @newchildren, $newpara if $newpara->has_children;
      push @newchildren, $child;
      $newpara = $p->copy;
    }
    else {
      $child->paste(last_child => $newpara);
    }
  }

  push @newchildren, $newpara if $newpara->has_children;
  $p->replace_with(@newchildren);
}

输出

<xml>
  <p class="indent">text <i>text</i> incluce </p>
  <div>text</div>
  <p class="indent"> ateas</p>
  <p class="text">text text incluce </p>
  <div>text</div>
  <p class="text"> <b>ateas</b></p>
  <p class="text">text <p>text</p> incluce </p>
  <div>text</div>
  <p class="text"> ateas</p>
</xml>
于 2013-01-07T07:01:47.110 回答