【发布时间】:2016-02-13 06:05:35
【问题描述】:
谁能帮我弄清楚如何在使用 XML Twig 使用以下代码在文件中打印之前检查标签是否存在:
open my $file, '>', "output.txt";
#parse the record
my $t= XML::Twig->new(twig_roots => {
'parent/child/code' => \&code,
'parent/child/name' => \&name,
});
$t->parsefile("test.xml");
sub name {
my($t, $elt)= @_;
$n = $elt->text;
print $file "$n,";
$t->purge;
}
sub code {
my($t, $elt)= @_;
$a = $elt->first_child->att('c');
print $file "$a\n";
$t->purge;
}
我想检查<code> 标签是否存在,并以格式化的方式在文本文件中打印它。
我在输出文件中使用上述代码得到以下信息:
Alex,001
Ryan,Nicole,003
但我希望能够获得所需的输出:
Alex,001
Ryan
Nicole,003
test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<child>
<name>Alex</name>
<code c="001">001AB</code>
</child>
<child>
<name>Ryan</name>
</child>
<child>
<name>Nicole</name>
<code c="003">001XC</code>
</child>
</parent>
【问题讨论】:
-
似乎不可能 -
code标签出现在name标签之后,您需要知道在名称标签处理程序中是打印,还是\n。我想你应该删除你的处理程序并为child添加一个。 -
@Kenny 我有一个非常大的文件,我认为放置“子”处理程序需要大量内存。
-
如果它只是打印一些东西,那么它应该无关紧要。
-
如果内存是一个问题,您可以尝试的一个“hack”是在处理之前转换 xml(可能使用 xslt)以交换名称和代码标签的顺序。然后,您需要将代码值保存到代码处理程序中的变量中,并且只在名称处理程序中打印它。
-
child处理程序将仅在您进行清除时使用元素大小的内存。所以没关系。