XML removeChild,但out输出有一个空行

时间:2013-10-14 21:20:46

标签: perl libxml2 xml-libxml

简单的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>

3 个答案:

答案 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);

获得格式良好的输出。