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>
我正在处理一个包含一些混合内容的 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>