XML 構成ファイルを変更するスクリプト

XML 構成ファイルを変更するスクリプト

スクリプトを使用してインストール プロセスを自動化しようとしています。プロセスの一部は、XML 構成ファイル (下記参照) の特定のセクションを検索し、特定のパラメータを から に変更したりfalsetrueその逆を行ったりすることです。

<enabled>構成ファイル内には、タグ (この場合は セクション)を持つセクションが多数あります<ssh>。そこで質問ですが、特定の<enabled>タグを検索して変更するにはどうすればよいでしょうか?

<ssh>
  <enabled>true</enabled>
  <ip>0.0.0.0</ip>
  <port>2024</port>
</ssh>

答え1

実際には十分な XML の例を示していないので、少し推測するしかありません。

この作業に適したツールとしては、適切な XML パーサーと Perl をお勧めします。

以下のものは使用しないことを強くお勧めします。

どちらも脆弱であるため、制御された状況ではある程度機能しますが、ある日突然壊れる可能性のある、厄介なコードが存在します。

xpath代わりに、 XML 用語で言えば、必要なコンテンツを検索/選択して変更する方法をサポートするパーサーを使用します。

のようなものはXML::Twig、参入障壁が低いです。(XML::LibXML も堅実な代替手段ですが、より網羅的です)。

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig; 

#parse the content - you probably want `parsefile` here instead. 
my $twig = XML::Twig -> new ( pretty_print => 'indented_a' ) -> parse ( \*DATA );

#select the node you want, alter it. 
$twig -> get_xpath('./ssh/enabled',0) -> set_text('false');

#print the output (to STDOUT) - you can print {$output_fh} $twig->sprint; instead
$twig -> print;


__DATA__
<xml>
  <www>
    <enabled>true</enabled>
    <ip>0.0.0.0</ip>
    <port>80</port>
  </www>
  <ssh>
    <enabled>true</enabled>
    <ip>0.0.0.0</ip>
    <port>2024</port>
  </ssh>
  <smtp>
    <enabled>true</enabled>
    <ip>0.0.0.0</ip>
    <port>25</port>
  </smtp>
</xml>

注 - get_xpath「ディレクトリ構造」のような形式を使用します。XML 内の絶対パスと相対パスをサポートします。上記のように実行すると、そのパスに一致する最初の要素に対して動作します (XML では複数の要素が許可されます)。

ただし、'foreach' ループで実行することは可能です。

foreach my $thing ( $twig -> get_xpath ('//enabled') ) {
   $thing -> set_text('false'); 
}

すべてを無効にします。

xpath非常に柔軟です。パス、要素、属性を指定する方法であり、理想的に適合正規表現のような方法で XML をナビゲートします。

したがって、再帰的に検索するための構造が存在します//

または、//node[@name='test']以下を検索します:

<node name="test">content</node>

あります便利なクイックリファレンスこれにより、xpath を使用して XML をナビゲートする方法を簡単に確認できます。

答え2

設定ファイル内の複数のノードに同じ名前の子ノードがあるため、XML 形式を実際に理解できる方法でスクリプトを記述することをお勧めします。以下は、2 つの設定要素を変更する Perl の例です。

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;

my $config = 'config.xml';
my $xml = XMLin($config, KeepRoot => 1, ForceArray => 1,);

$xml->{config}->[0]->{ssh}->[0]->{enabled} = 'false';
$xml->{config}->[0]->{web}->[0]->{ip} = '127.0.0.1';

XMLout($xml, KeepRoot => 1, NoAttr => 1, OutputFile => $config,);

私の入力は次のとおりですconfig.xml:

<config>
  <ssh>
    <enabled>true</enabled>
    <ip>0.0.0.0</ip>
    <port>2024</port>
  </ssh>
  <web>
    <enabled>true</enabled>
    <ip>0.0.0.0</ip>
    <port>80</port>
  </web>
</config>

出力は次のようになります。

<config>
  <ssh>
    <enabled>false</enabled>
    <ip>0.0.0.0</ip>
    <port>2024</port>
  </ssh>
  <web>
    <enabled>true</enabled>
    <ip>127.0.0.1</ip>
    <port>80</port>
  </web>
</config>

関連情報