perl 如何使用XML::Twig选择XML文件的特定子节点?

txu3uszq  于 2023-05-29  发布在  Perl
关注(0)|答案(3)|浏览(204)

我有一个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)告诉我我有:

wrong navigation condition './tuv/seg' ()

有人知道如何访问seg节点的文本以及如何访问tu节点的changedate属性吗?

mklgxw1f

mklgxw1f1#

以下是访问该节点和属性的一种方法:

my $original_seg = $original_tu->first_child('tuv')->first_child('seg')->text;
my $date = $original_tu->att('changedate');
ds97pgxw

ds97pgxw2#

您不能在first_child中使用完整的XPath表达式,只能使用单个XPath步骤(即您只能向下一级)。
要使用XPath表达式,需要使用findnodesmy $original_seg = $original_tu->findnodes('./tuv/seg', 0)->text,0获取(潜在)命中列表的第一个元素。
要访问属性,请使用$original_tu->att( 'date')

vbkedwbf

vbkedwbf3#

first_child中使用的条件不能使用XPath。详情请参见https://metacpan.org/module/XML::Twig#cond。如果方法确实是这样的话,那么它的名字就错了--first_child返回一个子对象,但是segtu的孙对象。
您可以使用first_descendant('seg')
要访问该属性,请使用$original_tu->att('changedate')方法。

相关问题