Eu tenho um arquivo xml (client_23.xml)
no qual eu preciso adicionar algumas linhas em uma determinada seção sobre o que há em outro arquivo xml (abc_lop.xml)
.
Aqui está o meu arquivo abc_lop.xml
no qual você vê que tenho muitas ClientField
linhas com name
, pptype
e dataType
nele.
<Hello version="100">
<DataHolder numberOfFields="67">
<ClientField name="target" pptype="aligning" dataType="string">
<Value value="panel_3646"/>
<Value value="panel_3653"/>
</ClientField>
<ClientField name="category_3652_0_count" pptype="symetrical" dataType="double"/>
<ClientField name="category_3652_2_count" pptype="symetrical" dataType="double"/>
<ClientField name="category_3646_0_count" pptype="symetrical" dataType="double"/>
<ClientField name="pme.cdert" pptype="symetrical" dataType="double"/>
<ClientField name="pme.age" pptype="symetrical" dataType="double"/>
<ClientField name="category_3648_1_count" pptype="symetrical" dataType="double"/>
<ClientField name="pme.number" pptype="symetrical" dataType="double"/>
<ClientField name="pme.gender" pptype="aligning" dataType="string">
<Value value=""/>
<Value value="F "/>
<Value value="NA"/>
</ClientField>
<ClientField name="pme.status" pptype="aligning" dataType="string">
<Value value=""/>
<Value value="A"/>
<Value value="S"/>
<Value value="NA"/>
</ClientField>
<ClientField name="pme.selling_id" pptype="aligning" dataType="string">
<Value value="c0"/>
<Value value="c1"/>
<Value value="NA"/>
</ClientField>
</DataHolder>
</Hello>
Eu preciso ler este arquivo e extrair name
dessas ClientField
linhas e se seu pptype
não for aligning
, então eu preciso construir esta linha para cada nome: Abaixo está um exemplo para dois nomes, apenas o primeiro valor é diferente e, além disso, os outros dois sempre serão iguais.
<eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
<eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>
Agora, se o seu pptype
for aligning
, construa uma linha como esta:
<eval>upsert("target", "NA", $calty_strings)</eval>
<eval>upsert("pme.gender", "NA", $calty_strings)</eval>
E todas essas mudanças eu tenho que fazer no arquivo client_23.xml
e então fazer um novo arquivo com ele para que meu novo arquivo fique assim: Exemplo: Eu terei uma função com o nome data_values
no qual eu preciso para adicionar itens acima na tag <block>
, conforme mostrado abaixo.
<function>
<name>data_values</name>
<variables>
<variable>
<name>temp</name>
<type>double</type>
</variable>
</variables>
<block>
<eval>temp = 1</eval>
<eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
<eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>
<eval>upsert("target", "NA", $calty_strings)</eval>
<eval>upsert("pme.gender", "NA", $calty_strings)</eval>
</block>
</function>
Isso é o que eu tenho atualmente no arquivo client_23.xml
, então, depois de adicionar, ele ficará como acima:
<function>
<name>data_values</name>
<variables>
<variable>
<name>temp</name>
<type>double</type>
</variable>
</variables>
<block>
<eval>temp = 1</eval>
</block>
</function>
Eu tenho um shell script muito simples que o terdon me ajudou anteriormente, no qual estamos usando o script perl como mostrado abaixo. Eu adicionando cabeçalho e rodapé no arquivo abc_lop.xml
e, em seguida, armazenando em file
variable e, em seguida, usando esse valor de arquivo para colocar em uma seção específica no arquivo client_23.xml
, mas não sei como fazer as coisas acima. p>
SCRIPT: -
for word in $client_types
do
## Concatenate the header, the contents of the target file and the
## footer into the variable $file.
file=$(printf '%s\n%s\n%s' "$header" "$(cat "$path/${word}_lop.xml")" "$footer")
## Edit the target file and print
perl -0pe "s#<eval>planting_model = 0</eval>#<eval>planting_model = 1</eval> s#<trestra-config>.* </trestra-config>##sm; s#<function>\s*<name>DUMMY_FUNCTION.+?</function>#$file#sm" client_"$client_id".xml > "$word"_new_file.xml
done
Aqui client_types
será assim: abc def pqr
e $client_id
é 23.
Agora preciso adicionar funcionalidades acima das quais não sei como posso fazer isso facilmente?