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

如何从perl中删除XML中的特定元素,perl,xslt,Perl,Xslt,因为我需要删除特定元素element1和element 2,如果它们与空内容相同 例如: 首先删除所有空元素2,然后删除空元素1,因为原来包含元素2的元素现在应该包括在内 您可以直接在XPath中指定空值: use strict; use warnings; use XML::LibXML; my $xml = 'XML::LibXML'->load_xml(location => '1.xml'); for my $element_name (qw( element2 eleme

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

例如:


首先删除所有空元素2,然后删除空元素1,因为原来包含元素2的元素现在应该包括在内

您可以直接在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);

element1不是emtpy,它包含element2。@choroba:接受。当元素2也是空的时,请考虑元素1是空的。<代码>我的$XML =‘XML::LibXML’>加载XML(位置=> 1。XML);
如何加载
xml内容
而不是
xml文件
@ssr1012:检查的文档:您可以指定
位置
IO
字符串
。我知道了。谢谢。这将删除任何地方的空
元素,而这些元素可能必须保留在
元素之外。
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);
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);