如何从perl中删除XML中的特定元素

时间:2017-05-10 07:07:07

标签: perl xslt

因为我需要删除特定元素element1 and element 2,如果它与空内容相同。

例如:

 <severaltags>
   ...
   <element1><element2/></element1>
   ...
 <severaltags>

此处element 1为空且element 2因此我需要删除特别是那两个元素element1element2

任何人都可以帮助你解决这个问题:

我已经搜索并尝试了以下代码,但没有成功。

use strict;
use warnings;
use XML::LibXML;

my $xml = XML::LibXML->new->parse_fh(*DATA);
for ( $xml->findnodes("//*") )
{
    $_->parentNode->removeChild($_)
    unless $_->textContent() =~ /\S/
    or $_->hasAttributes();
}
print $xml->serialize(1);

1 个答案:

答案 0 :(得分:3)

首先删除所有空的element2,然后删除空的element1,因为现在应该包含最初包含element2的那些。

您可以直接在XPath中指定空白:

use strict;
use warnings;
use XML::LibXML;

my $xml = 'XML::LibXML'->load_xml(location => '1.xml');
for my $element_name (qw( element2 element1 )) {
    for my $element ($xml->findnodes("//$element_name"
                                     . '[not(text() | * | @*)]')
    ) {
        $element->parentNode->removeChild($element);
    }
}

print $xml->serialize(1);