Script para modificar o arquivo de configuração XML

2

Estou tentando automatizar um processo de instalação com um script. Parte do processo é encontrar certas seções do arquivo de configuração XML (vistas abaixo) e alterar certos parâmetros de false para true ou vice-versa.

Existem muitas seções dentro do arquivo de configuração que possuem a tag <enabled> (neste caso é a seção <ssh> ). Então, minha pergunta é: como posso pesquisar a tag específica <enabled> e modificá-la?

<ssh>
  <enabled>true</enabled>
  <ip>0.0.0.0</ip>
  <port>2024</port>
</ssh>
    
por woogad 15.02.2016 / 19:56

2 respostas

1

Como vários nós no seu arquivo de configuração têm nós-filhos com o mesmo nome, eu recomendaria escrever seu script de uma maneira que realmente entenda o formato XML. Veja um exemplo de Perl para modificar dois dos seus elementos de configuração:

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

Aqui está minha entrada 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>

E aqui está a saída:

<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>
    
por 15.02.2016 / 23:12
1

Você ainda não deu um XML grande o suficiente, então estou adivinhando um pouco.

Eu sugeriria que a ferramenta para o trabalho é um parser XML decente e perl.

Eu sugiro strongmente que você NÃO use:

Porque ambos são frágeis - eles funcionam mais ou menos, em circunstâncias controladas, mas você tem um código hacky desagradável que pode ser misteriosamente quebrado um dia.

Em vez disso - use um analisador que suporte xpath , que é - em termos XML - uma maneira de localizar / selecionar o conteúdo desejado e modificá-lo.

Algo como XML::Twig é uma barreira baixa à entrada. (XML :: LibXML também é uma alternativa sólida, mas mais exaustiva).

#!/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>

Nota - get_xpath usa um tipo de formato de 'estrutura de diretórios'. Ele suporta caminhos absolutos dentro do XML, bem como caminhos relativos. A maneira como é executado acima, ele irá operar no primeiro elemento que corresponde a esse caminho (XML permite múltiplos).

Você pode, no entanto, fazer isso em um loop 'foreach':

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

para desativar tudo.

xpath é bastante flexível - é uma maneira de especificar caminho, elemento e atributos e é ideal para navegar XML de maneira semelhante à expressão regular.

Então você tem construções como // para encontrar recursivamente.

Ou //node[@name='test'] para encontrar:

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

Há uma referência rápida e prática que oferece uma maneira fácil de ver como navegar pelo XML usando o xpath.

    
por 17.02.2016 / 17:09