【问题标题】:XML removeChild, but out output has a blank rowXML removeChild,但输出有一个空白行
【发布时间】:2013-10-14 21:20:46
【问题描述】:

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

【问题讨论】:

    标签: perl libxml2 xml-libxml


    【解决方案1】:

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

    <doc>
      <elem/>
    </doc>
    

    doc 元素包含以下节点:

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

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

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

    【讨论】:

    • 感谢您的回复...帮帮我...你说“一个包含换行符和两个空格字符的文本节点”...这些到底在哪里?我猜换行符就在第一行的 之后,两个空格在第二行的 之前......但这是我的困惑:我使用了我的 $parser->keep_blanks(0 ),当我写入文件时,没有额外的空白 - 它只是一个连续的行(在一行中)。
    • 当我添加使用 XML::LibXML::PrettyPrint;是说没用。在目标平台上(就像您的链接中提到的其他海报一样),我不能/不能将此模块添加到脚本将在其上运行的所有工作站。我使用了 XML::Twig 的 pretty_print,但现在我有一个场景,其中我使用了两个不同的解析器(XML 与 Twig)。所以我的下一个问题是……我可以在脚本中的两个解析器之间轻松切换吗?
    • 我可以使用 Twig,但我必须走很长的路……我必须先从 XML 中写出文件,然后使用 Twig 的方法打开它并使用 pretty_print => ' indent' ...这可以得到一个带有缩进的格式化文件(并删除空行),但它看起来很复杂。
    • 如果您使用$parser-&gt;keep_blanks(0),使用$doc-&gt;toString(1) 编写文档应该可以。
    • 好的,好的,很抱歉回答我自己的帖子......所以只坚持使用 LibXML(没有 Twig 的东西)如果我添加 $parser->keep_blanks(0); ,当需要打印到文件时,我包括 print {$FH} $doc->toString(1);将得到我不想要的输出,即没有空白行并且正确缩进(不管源文件中的空格)。
    【解决方案2】:

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

    my $output = $doc->toString(0);
    $output =~ s/(?<=\n)\s*\n//g;
    print {$FH} $output;
    

    【讨论】:

    • 我认为手动更改字符串不是一个好主意。例如,此代码还将删除文本节点中的非可选换行符。
    【解决方案3】:

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

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

    由于空格被删除,您需要使用:

    print $dom->toString(1);
    

    获得格式良好的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多