Perl XML :: twig:在混合内容

时间:2016-10-31 14:16:37

标签: xml perl xml-twig

我处理的XML文件包含一些混合内容(包含文本的元素,一个子标记,然后是文本)。
我想为每个父元素提取紧跟在子元素之前的单词(substring)。

XML输入示例:

<root>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
</root>

文本输出示例:

all
all
all
all

我知道将text_only应用于parent元素会给我there is text all around it,因此我不再需要处理子元素,但是我不会# 39;不知道如何找到前面的单词。

我应该用某种文本标记替换child元素,例如|,只是将剩余的文本作为单个字符串进行处理?

我不是要求一个完整的&#34;现成的&#34;回答,但有些方向肯定会有所帮助。

1 个答案:

答案 0 :(得分:3)

您可以找到每个child元素,然后检查左侧兄弟的文本。那是以前的兄弟。方便地there is a method prev_sibling_text提供了这一点,因为前一个兄弟是一个文本节点。从那里开始,只需要找到最后一个字。

use strict;
use warnings;
use feature 'say';
use XML::Twig;

my $twig = XML::Twig->new(
    TwigHandlers => {
        child => sub {
            say +( split /\s/, $_->prev_sibling_text )[-1];
        },
    }
);

$twig->parse( \*DATA );

__DATA__
<root>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
<parent> there is text all <child>text</child> around it</parent>
</root>