如何在Perl中使用XML :: Twig选择xml文件的特定子节点

时间:2013-08-06 13:41:24

标签: xml perl xml-twig

这一定是一个愚蠢的问题,但我有点卡住了:

我有一个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">&lt;seg&gt;Some text.&lt;/seg&gt;</prop>
    <prop type="x-context-post">&lt;seg&gt;Other text.&lt;/seg&gt;</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节点的更改属性?

非常感谢。

大森

3 个答案:

答案 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表达式,您需要使用findnodesmy $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返回一个孩子,但segtu的孙子。

您可以改为使用first_descendant('seg')

要访问该属性,请使用$original_tu->att('changedate')方法。