如果使用perl在xml文件中找到关键字,则拆分父元素

时间:2017-12-07 09:41:46

标签: xml perl

  

问题已更新

我在xml文件中有一个关键字标签<split/>。基于此,我需要拆分已经打开的元素,并且还需要打开 DUMMY OPENING TAGS ,我们在关键字元素上添加结束标记。

例如。输入:

<section>
   <para> The para sample lines...
      <list>
     <list-item><para> ..... .... </para></list-item>
     <list-item><para> ..... .... </para></list-item>
     <list-item><para> ..... <split/> .... </para></list-item>
      </list>
     The para sample lines.. </para>
</section>

预期产出:

<section>
   <para> The para sample lines...
      <list>
     <list-item><para> ..... .... </para></list-item>
     <list-item><para> ..... .... </para></list-item>
     <list-item><para> ..... </para></list-item>
      </list>
   </para>
</section>
*<split/>*
<section> <!--dummy tag-->
   <para><!--dummy tag-->
      <list><!--dummy tag-->
     <list-item><para><!--dummy tag--> <split/> .... </para></list-item>
      </list>
      The para sample lines.. </para>
</section>
  

注意:星号仅用于识别目的(需要删除标签)

我是基于标记语言使用Module的新手。有人可以帮助我理解这个想法。 (我也在尝试......)

1 个答案:

答案 0 :(得分:2)

以下是使用XML::Twig

执行此操作的示例
#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $first_doc = XML::Twig -> parse ( \*DATA ); 

my $second_doc = XML::Twig -> new; 
$second_doc -> set_root ( $first_doc -> root -> copy ); #create a copy. 

while ( my $after_split = $first_doc -> get_xpath('//split',0)->next_sibling ) {
   $after_split -> delete;
}

$first_doc -> get_xpath('//split',0) -> delete; # delete split tag.

while ( my $before_split = $second_doc -> get_xpath('//split',0)->prev_sibling ) {
   $before_split -> delete;
}

$second_doc -> get_xpath('//split',0) -> delete; # delete split tag. 

$first_doc -> set_pretty_print ('indented_a');
$first_doc -> print;

print "\n--- second doc ---\n"; 
$second_doc -> set_pretty_print ('indented_a');
$second_doc -> print;


__DATA__
<section>
   <para>
      <list>
      <list-item><para> sample content for first doc <split/> second doc sample content </para></list-item>

      </list>
   </para>
</section>

这可以作为输出:

<section>
  <para>
    <list>
      <list-item>
        <para> sample content for first doc </para>
      </list-item>
    </list>
  </para>
</section>

--- second doc ---
<section>
  <para>
    <list>
      <list-item>
        <para> second doc sample content </para>
      </list-item>
    </list>
  </para>
</section>

您可能希望从parsefile查看sprintXML::Twig来处理读取您自己的文件并生成输出。

注意 - 这是一个完整的分裂&#39;该文档基本上是两个单独的文档 - 但是这个技术应该使用子树,因为它的核心是定位你的split元素,并在必要时删除它之前或之后的所有内容。