extrai o valor da tag xml do arquivo em que o nome do arquivo possui espaços

1

Eu tenho um arquivo 'EXXARS - Relatório de ajuste de inventário físico US PDF_es_ES.xlf'

dados do arquivo:

<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

Eu preciso extrair o valor entre e resultado: eu preciso desse valor na variável XXPO_PHYS_INV_ADJ_ES_ES.

Eu tenho amigos e não está funcionando

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
sed -n 's:.*<prop prop-type="TemplateCode">\(.*\)</prop>.*::p' filename > ${LOBCODE}
echo " --> ${LOBCODE}"
    
por Arun GoWdA 02.03.2018 / 08:17

3 respostas

1

Supondo que o arquivo XML esteja bem formado:

<?xml version="1.0"?>
<header>
  <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
  </prop-group>
</header>

Usando o XMLStarlet :

xmlfile='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$( xml sel -t -v '//prop[@prop-type="TemplateCode"]' "$xmlfile" )

Isso usa XMLStarlet para extrair o valor do nó prop cujo atributo prop-type é TemplateCode . A variável LOBCODE obterá o valor XXPO_PHYS_INV_ADJ_ES_AS com o XML acima.

Às vezes, o XMLStarlet pode ser instalado como xmlstarlet em vez de xml .

Existem dois problemas com o seu código:

  1. Você redireciona a saída do comando sed para um arquivo cujo nome é dado por $LOBCODE . Se $LOBCODE estiver vazio, esse redirecionamento falhará. O que eu suponho que você queria fazer era atribuir a saída de sed à variável LOBCODE . Isso é feito com uma substituição de comando, como mostrei acima. Note que sed é uma má escolha de ferramenta para analisar dados XML.

  2. Você instrui o sed a trabalhar com um arquivo chamado filename . Para que sed trabalhe no valor da variável filename , você precisará usar $ na frente do nome da variável. Além disso, como o nome do arquivo possui espaços, você precisa duplicar a expansão da variável (você deve sempre fazer isso, independentemente). Portanto, você deve usar "$filename" (usei um nome de variável mais descritivo no meu código acima).

por 02.03.2018 / 08:34
0

@ A resposta de Kusalananda é excelente, mas se você tiver xmllint , você pode usar isto:

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$(xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@prop-type='TemplateCode']/text()" "$filename")

Notas:

  • Eu usei a especificação de caminho completo caso você queira apenas o prop-group com o atributo "ora-reconstruction". @ O método de Kusalananda assume que você quer qualquer elemento prop com um atributo de "TemplateCode": qual método é preferível depende de seus dados.
  • text() retorna apenas o texto dentro do elemento prop (caso contrário, xmllint retornará o elemento adjacente também.)

Exemplo de execução da parte importante:

$ xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@proptype='TemplateCode']/text()" "ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf"
XXPO_PHYS_INV_ADJ_ES_AS
    
por 02.03.2018 / 08:52
-2
$ cat test.xml
<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

$ awk -F"[<>]" '/TemplateCode/{print $3;exit}' test.xml
XXPO_PHYS_INV_ADJ_ES_AS
    
por 02.03.2018 / 08:58

Tags