Perl XML::twig:在混合内容中查找位于子元素之前的子字符串

Perl XML::twig : Find a substring located before a child element in mixed content

我正在处理一个包含一些混合内容的 XML 文件(元素包含文本、一个子标签,然后又是文本)。
我想为每个父元素提取子元素之前的单词(子字符串)。

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,所以我不必再处理子元素了,但是我不不知道如何定位前面的词。

我是否应该将 child 元素替换为某种文本标记,例如 |,然后将剩余的文本作为单个字符串遍历?

我不是要完整的 "ready-made" 答案,但一些指导肯定会有帮助。

您可以找到每个 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>