这一定是一个愚蠢的问题,但我有点卡住了:
我有一个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)告诉我,我有: 错误的导航条件'./tuv/seg'()
有谁知道如何访问seg节点的文本,如果您还没有厌倦我,那么如何访问tu节点的更改属性?
非常感谢。
大森
答案 0 :(得分:2)
以下是访问该节点和属性的一种方法:
my $original_seg = $original_tu->first_child('tuv')->first_child('seg')->text;
my $date = $original_tu->att('changedate');
答案 1 :(得分:1)
你不能使用first_child
的完整XPath表达式,只需要一个XPath步骤(即你只能降低1级)。
要使用XPath表达式,您需要使用findnodes
:my $original_seg = $original_tu->findnodes('./tuv/seg', 0)->text
(,0
获取(潜在)点击列表的第一个元素。
要访问属性,请使用$original_tu->att( 'date')
答案 2 :(得分:0)
first_child
中使用的条件无法使用XPath。有关详细信息,请参阅https://metacpan.org/module/XML::Twig#cond。该方法如果错误命名 - first_child
返回一个孩子,但seg
是tu
的孙子。
您可以改为使用first_descendant('seg')
。
要访问该属性,请使用$original_tu->att('changedate')
方法。