问题已更新
我在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的新手。有人可以帮助我理解这个想法。 (我也在尝试......)
答案 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
查看sprint
和XML::Twig
来处理读取您自己的文件并生成输出。
注意 - 这是一个完整的分裂&#39;该文档基本上是两个单独的文档 - 但是这个技术应该使用子树,因为它的核心是定位你的split
元素,并在必要时删除它之前或之后的所有内容。