Renomeia os elementos XML para uma sequência

2

Eu estava olhando para uma possível solução baseada em XML para outra pergunta . Estou ciente de sua resposta aceita , que oferece sed e python soluções.

O fragmento XML fornecido é:

<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

e o requisito é alterar os nomes dos elementos <Name/> para uma sequência <Name1/> , <Name2/> , <Name3/> , etc.

Usando xmlstarlet I, posso renomear os valores do elemento <Name/> para um valor fixo com algo parecido com isto

xmlstarlet ed -u '//Name' -v 'Another' names.xml

<Names>
  <Another>Luigi</Another>
  <Another>Mario</Another>
  <Another>Peach</Another>
</Names>

E posso até alterar os valores dos elementos para uma expressão com -x ( --expr ).

Mas, para editar os próprios nomes de elementos, não há uma opção -x ( --expr ) como alternativa à opção -v ( --value ), por isso não posso usar algo assim:

xmlstarlet ed -u '//Name' -x 'concat(., position())' names.xml

Usando uma ferramenta com reconhecimento de XML, como xmlstarlet , é possível transformar o XML de entrada para diferenciar os elementos <Name/> dessa forma e, em caso afirmativo, como?

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>
    
por roaima 11.11.2017 / 00:42

1 resposta

2

Minha experiência com ferramentas de linha de comando XML me deixou com a sensação de que há muito a desejar. Quase sem falhar eu me vejo desistindo e apenas usando Python. Dito isso, acho que tenho uma solução XQuery para esse problema que funciona com o utilitário basex . Aqui está a expressão XQuery:

<!-- xml_rename_sequence.xquery -->
for $name at $position in doc('names.xml')//Name
return rename node $name as concat(name($name),$position)

E aqui está o arquivo de dados XML:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

Aqui está como nós executamos o script (ele modifica o arquivo no local):

basex -u xml_rename_sequence.xquery

E aqui está o arquivo de dados atualizado:

<!-- names.xml -->
<Names>
  <Name1>Luigi</Name1>
  <Name2>Mario</Name2>
  <Name3>Peach</Name3>
</Names>

Eu também tentei usar as seguintes ferramentas (sem sucesso):

Aqui estão algumas postagens que encontrei sobre como incrementar um contador no XQuery:

E aqui estavam algumas outras referências que usei:

por 11.11.2017 / 02:34