Atualização do valor XML com xmlstarlet

1

Eu tenho o arquivo 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>

Gostaria de alterar o valor do elemento.

Eu tentei seguir:

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

e

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

Mas isso não mudou o valor do "título do aplicativo".

    
por Ladislav M 23.11.2014 / 21:45

3 respostas

1

Você precisa especificar o namespace, pois o elemento name está no namespace 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
    
por 23.11.2014 / 22:31
0

Este comando funciona bem, mas altera todas as entradas no arquivo xml. (todos os campos com nome)

O que inserir se houver mais campos com o mesmo nome. Eu tentei:

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

mas nada acontece. O comando, no entanto, é aceito.

Quando uso

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

todos os itens com a porta de nome estão sendo alterados para o valor 999.

    
por 14.11.2016 / 15:25
0

A perl é uma opção? Se assim for, eu sugiro - a excelente biblioteca XML::Twig faz um pequeno trabalho na maioria dos problemas de análise de XML. Incluindo a edição em vigor:

#!/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');

(Você pode alimentar o nome do arquivo na linha de comando, com $ARGV[0] )

    
por 18.11.2016 / 17:06

Tags