【问题标题】:XML::Twig is ignoring some elements?XML::Twig 忽略了一些元素?
【发布时间】:2011-05-16 13:41:01
【问题描述】:

部分 XML 如下所示:

<ipcEntry kind="1" symbol="A01B0013080000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
    <textBody>
        <title>
            <titlePart>
                <text>for working subsoil</text>
            </titlePart>
        </title>
    </textBody>
    <ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
        <textBody>
            <title>
                <titlePart>
                    <text>Special implements for lifting subsoil layers</text>
                </titlePart>
            </title>
        </textBody>
        <ipcEntry kind="3" symbol="A01B0013120000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
            <textBody>
                <title>
                    <titlePart>
                        <text>Means for distributing the layers on the surface</text>
                    </titlePart>
                </title>
            </textBody>
        </ipcEntry>
    </ipcEntry>
</ipcEntry>

我的代码是:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper;

my $twig_handlers = { 'ipcEntry' =>  \&ipcEntrySub };

my $file = 'A01B.xml';
my $twig= new XML::Twig( twig_handlers => $twig_handlers );
$twig->parsefile($file);
#$twig->print;




sub ipcEntrySub {

   my ($twig_obj, $element) = @_;

  print $element->{'att'}->{'symbol'} . "\n";
 print "Kind: $element->{'att'}->{'kind'}\n";
 print $element->text . "\n";
 print "###########################################\n";


    $twig_obj->purge;

}

好像看不到文字:&lt;text&gt;Special implements for lifting subsoil layers&lt;/text&gt; 我猜是因为&lt;ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"&gt; 有另一个子 ipcEntry。

我可以得到&lt;text&gt;Means for distributing the layers on the surface&lt;/text&gt;

我在这里做错了什么?

谢谢,

【问题讨论】:

  • 您希望输出到底是什么?
  • 基本上,打印其中的所有 元素,以及每个 的属性
  • 清除时,会丢失当前元素之前的所有元素。您只需将元素的父元素保留为空,即您仍然可以访问它们的属性,但它们的所有内容都会丢失。所以确实 delete 是你想要的。
  • +1 mirod,我认为您的评论比我的回答要清楚得多。如果您可以在 XML::Twig Perl 文档中包含上述注释,那就太好了。我当然很困惑,我如何访问属性,而不是清除元素后的内容。也非常感谢出色的 XML::Twig。

标签: xml perl xml-parsing xml-twig


【解决方案1】:

来自 XML::Twig 文档:

flush 这个方法不应该使用, 总是冲洗树枝,而不是一个元素。

purge 与“flush”相同 除了它不打印树枝。它 只删除所有具有 到目前为止已经完全解析了。

将 purge 函数替换为 delete 函数以相反的顺序打印所有 ipcEntry 元素的文本,即。从最里面的 ipcEntry 元素开始。

sub ipcEntrySub {
  my ($twig_obj, $element) = @_;

  print $element->{'att'}->{'symbol'} . "\n";
  print "Kind: $element->{'att'}->{'kind'}\n";
  print $element->text . "\n";

  $element->delete;
}

【讨论】:

  • XML 大小约为 8GB,如果我不每次都清除它,我的内存会填满,不是吗?或者很可能我不明白那个“清除”子背后的想法。
  • 请原谅我之前的回答不正确。您当然应该使用“delete”功能来剪切 ELEMENT(而不是使用“purge”功能)以释放内存。希望这会有所帮助。