使用 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 

每个具有名称 port 的项目都将更改为值 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]

相关内容