como analisar o xml como um argumento para um script de shell

1

este é o arquivo xml de amostra que eu tenho, eu preciso obter max_size como uma saída?

Eu tentei usar xlimit e xpath, ambos não funcionam.

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
   <service_info name="dummyapp" version="5.0"
   <object name="WebApplications">
      <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
   </object>
   <object name="jdbc_oracle_nonxa">
      <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>
    
por user2576747 27.02.2018 / 17:09

2 respostas

5

Supondo que o XML esteja bem formado, como

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
  <service_info name="dummyapp" version="5.0"/>
  <object name="WebApplications">
    <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
  </object>
  <object name="jdbc_oracle_nonxa">
    <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
  </object>
</weblogic-service>

(fechei tags que não foram fechadas na pergunta)

... então o seguinte irá gerar 25 (para este exemplo):

xml sel -t -v '//item/@max_size' -nl file.xml

Isso está usando o XMLStarlet para obter o valor do atributo max_value de todos os item nós. O -nl no final insere uma nova linha após a saída.

Se precisar ser mais específico e olhar apenas para o nó item no nó object , cujo name é jdbc_oracle_nonxa :

xml sel -t -v '//object[@name="jdbc_oracle_nonxa"]/item/@max_size' -nl file.xml

Observe que o XMLStarlet está instalado como xmlstarlet em vez de xml em alguns sistemas.

Usando xmllint (sem nova linha no final da saída):

xmllint --xpath 'string(//object[@name="jdbc_oracle_nonxa"]/item/@max_size)' file.xml
    
por 27.02.2018 / 17:36
0

Muitas vezes, você é muito mais rápido, mas menos seguro, com sed ou grep:

sed -E -n 's/.*max_size="([0-9]+)".*//p' sample-4.xml 
25

ou grep:

grep -Eo 'max_size="[0-9]+" ' sample-4.xml | grep -Eo "[0-9]+"
25

Ele não valida o xml e pode escolher o código comentado sem reconhecer. Se você olhar para a tela e obter dois resultados, poderá notar, mas se for usado em um processo automatizado, estará propenso a erros.

Às vezes, você escreve o programa, gerando o xml, para saber se ele pode gerar comentários ou max_size="..." em um contexto diferente e indesejado. Se você conhece os limites, não há nada errado com sed, grep ou awk, exceto que eles impedem que você aprenda a bela sintaxe xmlstarlet. :)

    
por 28.02.2018 / 04:55