2

XML ファイルがあり、それを読みたい - ノードを削除 - 保存したい。ターミナルから perl を実行します (perl script.pl)

XML の例 (filename.xml):

<?xml version="1.0" encoding="UTF-8"?>
<twice>
    <inner>
        <twice>
            <name>John</name>
            <surname>Smith</surname>
        </twice>
        <twice>
            <name>Alan</name>
            <surname>Bowler</surname>
        </twice>
        <twice>
            <name>Michael</name>
            <surname>Deck</surname>
        </twice>
    </inner>
</twice>

perl スクリプトの例 (script.pl):

use strict;
use warnings;
use XML::LibXML;
my $filename = "filename.xml";
my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file($filename);
for my $dead ($xmldoc->findnodes(q{/twice/inner/twice[surname = "Bowler"]})) {
    $dead->unbindNode;
}
print $xmldoc->toString;

これで、期待される結果が端末に出力されますが、ファイルは保存されません。
期待される結果 (filename.xml):

<?xml version="1.0" encoding="UTF-8"?>
<twice>
    <inner>
        <twice>
            <name>John</name>
            <surname>Smith</surname>
        </twice>
        <twice>
            <name>Michael</name>
            <surname>Deck</surname>
        </twice>
    </inner>
</twice>

何時間も検索しましたが、何も見つかりませんでした。重複していたらごめんなさい!
これは perl での私の最初の経験ですので、どんな助けも歓迎します、ありがとう。

4

2 に答える 2

5

toString を使用する場合、ドキュメントでは次のように実行するように指示されています。

open my $out_fh, '>', 'somefile.xml';
print {$out_fh} $xmldoc->toString;

toFile()関数を使用して保存することもできます。

$xmldoc->toFile("someFile.xml");

編集:ドキュメントを引用するために(私が行ったのはこれだけです)、これらの関数にフォーマットパラメーターを渡すことができます。

$format が 0 の場合、ドキュメントは最初に解析されたとおりにダンプされます

$format が 1 の場合、libxml2 は無視できる空白を追加するため、ノードのコンテンツが読みやすくなります。既存のテキスト ノードは変更されません

$format が 2 (またはそれ以上) の場合、libxml2 は $format == 1 として機能しますが、各テキスト ノードの先頭と末尾に改行が追加されます。

あなたに与える:

$xmldoc->toFile("someFile.xml", $format);

また

print {$out_fh} $xmldoc->toString($format);
于 2013-03-05T03:37:55.043 に答える
1

コマンド ラインからApp::Xml_grep2を使用してこれを行うこともできます。

xml_grep2 -v '/twice/inner/twice[surname = "Bowler"]' input.xml > output_xml
于 2013-03-05T08:25:34.827 に答える