i t e m 1 / > LF < i t e m 2 / > LF < i t e m 3 / > LF
####
< i t e m 1 / > LF LF < i t e m 3 / > LF
####
use strict;
use warnings;
use open ':std', ':locale';
use XML::LibXML qw( XML_TEXT_NODE );
sub remove_newline_that_follows {
my ($node) = @_;
my $next_node = $node->nextSibling()
or return;
$next_node->nodeType() == XML_TEXT_NODE
or return;
my $text = $next_node->data();
$text eq ""
and return remove_newline_that_follows($next_node);
$text =~ s/^\n//
and $next_node->setData($text);
}
sub remove_node {
my ($node) = @_;
$node->parentNode()->removeChild($node);
}
my $doc = XML::LibXML->load_xml( string => <<'__EOI__' );
__EOI__
my $root = $doc->documentElement();
my ($node) = $root->findnodes('//item2') or die;
remove_newline_that_follows($node);
remove_node($node);
print $root->toString();
####
my ($next_node) = $node->findnodes(
'following-sibling::*[ position()=1 and text() ]')
or return;
####
my ($next_node) = $node->findnodes(
'following-sibling::node()[ position()=1 and self::text() ]')
or return;
####
my $next_node = $node->nextSibling()
or return;
$next_node->nodeType() == XML_TEXT_NODE
or return;