необходимо указать пространство имен начиная с имя
, элемент находится в 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
Эта команда работает нормально, но изменяет каждую запись в 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.
Является ли 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]
)