我有一个XML文件:
<?xml version="1.0" encoding="utf-16"?>
<!DOCTYPE tmx SYSTEM "56.dtd">
<body>
<tu changedate="20130625T175037Z"">
<tuv xml:lang="pt-pt">
<prop type="x-context-pre"><seg>Some text.</seg></prop>
<prop type="x-context-post"><seg>Other text.</seg></prop>
<seg>The text I'm interested.</seg>
</tuv>
<tuv xml:lang="it">
<seg>And it's translation in italian.</seg>
</tuv>
</tu>
.... followed by other <tu>'s
</body>
由于这是一个很大的文件,我使用XML::Twig
来解析它并获取我感兴趣的部分。我对seg
的节点内容以及tu
的节点属性特别感兴趣。
以下是我目前得到的代码:
use 5.010;
use strict;
use warnings;
use XML::Twig;
my $filename = 'filename.tmx';
my $out_filename = 'out.xml';
open my $out, '>', $out_filename;
binmode $out;
my $original_twig = new XML::Twig (pretty_print => 'nsgmls', twig_handlers => {tu => \&original_tu});
$original_twig->parsefile($filename);
sub original_tu {
my($twig, $original_tu) = @_;
my $original_seg = $original_tu-> first_child('./tuv/seg')->text;
}
Perl(或者我应该说XML::Twig
)告诉我我有:
wrong navigation condition './tuv/seg' ()
有人知道如何访问seg
节点的文本以及如何访问tu
节点的changedate
属性吗?
3条答案
按热度按时间mklgxw1f1#
以下是访问该节点和属性的一种方法:
ds97pgxw2#
您不能在
first_child
中使用完整的XPath表达式,只能使用单个XPath步骤(即您只能向下一级)。要使用XPath表达式,需要使用
findnodes
:my $original_seg = $original_tu->findnodes('./tuv/seg', 0)->text
(,0
获取(潜在)命中列表的第一个元素。要访问属性,请使用
$original_tu->att( 'date')
vbkedwbf3#
first_child
中使用的条件不能使用XPath。详情请参见https://metacpan.org/module/XML::Twig#cond。如果方法确实是这样的话,那么它的名字就错了--first_child
返回一个子对象,但是seg
是tu
的孙对象。您可以使用
first_descendant('seg')
。要访问该属性,请使用
$original_tu->att('changedate')
方法。