3

简单的removeChild测试,虽然去掉了xml那一行,但是却保持了一个空的空白行,怎么会呢?顺便说一句 - 我的源 xml 文件确实有缩进,但是即使我删除它们,我也会得到相同的结果。那么,如果它仍然保留一个空格,那么能够 removeChild 行有什么意义呢?

有没有办法在将生成的 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>
4

3 回答 3

5

空行来自包含空格的文本节点。考虑以下文档:

<doc>
  <elem/>
</doc>

doc元素包含以下节点:

  • 包含换行符和两个空格字符的文本节点。
  • 带有元素的元素节点elem
  • 另一个包含换行符的文本节点。

如果elem删除该元素,则仅保留文本节点,从而导致空行。

重新缩进文档最简单的方法XML::LibXML是使用模块XML::LibXML::PrettyPrint。也看看这个问题

于 2013-10-14T22:00:56.890 回答
0

删除前面有另一个换行符(肯定的后向断言)和中间可选空格的换行符。

my $output = $doc->toString(0);
$output =~ s/(?<=\n)\s*\n//g;
print {$FH} $output;
于 2014-08-12T23:33:05.220 回答
0

您可以使用该no_blanks选项load_xml()- 它会在导入 XML 时自动去除任何额外的空白元素:

use XML::LibXML;
my $dom = XML::LibXML->load_xml(location => $filename, no_blanks => 1);

由于删除了空格,因此您需要使用:

print $dom->toString(1);

获得格式良好的输出。

于 2016-06-20T17:13:29.693 回答