简单的removeChild测试,虽然删除了xml行,但它保持一个空的空行,怎么来的?顺便说一句 - 我的源xml文件确实有缩进,但即使我删除它们我得到相同的结果。那么,如果仍然保留一个空格,那么删除子行的意义何在?
在将输出的xml行输出到文件之前,有没有办法重新格式化?
foreach my $XYZ ($doc->findnodes("//EE1"))
{
my $library = $XYZ->parentNode;
$library->removeChild($XYZ);
}
print {$FH} $doc->toString(0);
RESULT IN OUTPUT FILE:
<?xml version="1.0"?>
<TopTag>
<AA1>ZNY</AA1>
<AA2>111</AA2>
<BB1>
<CC1>ZNY</CC1>
<CC2>
<DD1>
<-----blank line remains
<EE2>2000</EE2>
</DD1>
<DD1>
<-----blank line remains
<EE2>5000</EE2>
</DD1>
</CC2>
</BB1>
<AA1>ZNY2</AA1>
<AA2>2</AA2>
</TopTag>
答案 0 :(得分:5)
空行来自包含空格的文本节点。请考虑以下文档:
<doc>
<elem/>
</doc>
doc
元素包含以下节点:
elem
元素的元素节点。如果删除elem
元素,则仅保留文本节点,从而产生空行。
重新加载XML::LibXML
文档的最简单方法是使用模块XML::LibXML::PrettyPrint
。另请查看this question。
答案 1 :(得分:0)
删除前面有另一个换行符(正面后置断言)和两者之间的可选空格的换行符。
my $output = $doc->toString(0);
$output =~ s/(?<=\n)\s*\n//g;
print {$FH} $output;
答案 2 :(得分:0)
您可以使用no_blanks
的{{1}}选项 - 它会在导入XML时自动删除任何额外的空白元素:
load_xml()
由于删除了空格,因此您需要使用:
use XML::LibXML;
my $dom = XML::LibXML->load_xml(location => $filename, no_blanks => 1);
获得格式良好的输出。