xmlstarletを使用したXML値の更新

xmlstarletを使用したXML値の更新

config.xmlファイルがあります。

<?xml version="1.0" encoding="utf-8"?> 
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" id="app" version="2.5" android-versionCode="20500"> 
<name>App title</name> 
<description>Dummy dummy text.</description> 
</widget>

要素の値を変更したい。

私は以下を試しました:

xmlstarlet edit -L -u "/_:widget/name" -v "NEW_NAME" config.xml

そして

xmlstarlet edit -L -u "//name" -v "NEW_NAME" config.xml

ただし、「アプリケーションタイトル」の値は変更されていません。

答え1

要素が名前空間にnameあるため、名前空間を指定する必要があります。http://www.w3.org/ns/widgets

xmlstarlet edit -L -N w=http://www.w3.org/ns/widgets -u "//w:name" -v "NEW_NAME" config.xml

答え2

このコマンドは正常に機能しますが、xmlファイルのすべてのエントリを変更します。 (名前のあるすべてのフィールド)

同じ名前のフィールドが複数ある場合、何を入力する必要がありますか?私は試した:

xml ed -L -N w=http://artifactory.jfrog.org/xsd/1.7.9 -u "//w:mailServer/port" -v "123" artifactory.config.import.xml

しかし、何も起こりませんでした。しかし、注文は受け入れられました。

私が使うとき

xml ed -L -N w=http://artifactory.jfrog.org/xsd/1.7.9 -u "//w:port" -v "999" artifactory.config.import.xml 

名前ポートを持つ各エントリは値999に変わります。

答え3

perlオプションですか?もしそうなら、私はこれをお勧めします。この素晴らしいXML::Twigライブラリは、ほとんどのXML解析の問題を簡単に解決できます。内部編集を含む:

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

use XML::Twig; 

sub set_name {
    my ( $twig, $element ) = @_;
    $element -> set_text ('A NEW NAME'); 
    $twig -> flush;
}

my $twig = XML::Twig -> new ( pretty_print => 'indented', twig_handlers => { 'name' => \&set_name } );
$twig -> parsefile_inplace('config.xml');

(コマンドラインでを使用してファイル名を指定できます$ARGV[0]

関連情報