在 Perl 中使用 LibXML 缩进子节点

Indentation of child nodes using LibXML in Perl

我在使用 XML 添加子节点时难以保持缩进。

例如,如果我有以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<resources>

    <plurals name="number_of_items_selected">
        <item quantity="one">%1$d selected</item>
        <item quantity="other">%1$d selected</item>
    </plurals>

</resources>

还有这段代码:

#!/usr/bin/perl

use XML::LibXML;
use strict;

my $parser = XML::LibXML->new;
my $dom = $parser->parse_file("plurals.xml") or die;

my @plurals = $dom->getElementsByTagName("plurals");
foreach my $plural (@plurals){
    my $tag = $dom->createElement("item");
    $tag->setAttribute('quantity'=>'many');
    $tag->appendText("many items selected");
    $plural->appendChild($tag);
}
$dom->toFile("plurals.xml");

我得到这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<resources>

    <plurals name="number_of_items_selected">
        <item quantity="one">%1$d selected</item>
        <item quantity="other">%1$d selected</item>
    <item quantity="many">many items selected</item></plurals>

</resources>

而我想要得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<resources>

    <plurals name="number_of_items_selected">
        <item quantity="one">%1$d selected</item>
        <item quantity="other">%1$d selected</item>
        <item quantity="many">many items selected</item>
    </plurals>

</resources>

我不想使用 LibXML Pretty Print,因为它会改变 XML 的整个布局。我知道这在技术上都是一样的,但我会尽可能避免空格差异。

谢谢

I don't want to use LibXML Pretty Print

Pretty Print 是最好的选择。备选方案是:

  • 抓住 末尾的文本节点(现在在您的新项目之前),它以前是换行符和 4 个空格,并将其更改为换行符和 8 个空格
  • 在你的新项目后面添加一个文本节点,并给它一个换行符和 4 个空格

但是如果您的 XML 移动并改变深度,这些数字 (4/8) 将会改变。漂亮的打印(连同 no_blanks 解析)就是为您设计的那种东西。