Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Generer un fichier XML en script shell

3 réponses
Avatar
azerty
Bonjour,

Je souhaite générer un fichier XML depuis un script shell. Dans mon
script, j'utilise un fichier de configuration qui comporte MACHINE IP
PROJET de type :

> TOTO 192.168.0.1 XML01
> TATA 192.168.0.2 XML01
> TOTO 192.168.0.3 XML01

Je souhaite obtenir un fichier comme celui-ci :

> <root>
>
> <UN="XML01" Machine="TOTO" />
> <UN="XML01" Machine="TATA" />
>
> <DEUX="TOTO" >
> <TROIS="PIF" IP="192.168.0.1" QUATRE="POUF"/>
> <TROIS="PIF" IP="192.168.0.3" QUATRE="POUF"/>
> </DEUX>
>
> <DEUX="TATA" >
> <TROIS="PIF" IP="192.168.0.2" QUATRE="POUF"/>
> </DEUX>
>
> </root>

Voici le script que j'ai déjà écrit mais qui ne me satisfait pas :

> #!/bin/sh
>
> echo "<root>" > source.xml
>
> while read MACHINE IP PROJET
> do
> echo "<UN=\"$PROJET\" Machine=\"$MACHINE\" />" >> source.xml
> done < listing.cfg
>
> while read MACHINE IP PROJET
> do
>
> echo "<DEUX=\"$MACHINE\" >
> <TROIS=\"PIF\" IP=\"$IP\" QUATRE=\"POUF\"/>
> </DEUX>" >> source.xml
> done < listing.cfg
>
> echo "</root>" >> source.xml

Lorsqu'un équipement comporte plusieurs adresses ip, le fichier généré
n'est pas bon.

Merci de votre aide.

Bernard.

3 réponses

Avatar
Stephane Chazelas
2008-04-29, 13:26(+02), azerty:
Bonjour,

Je souhaite générer un fichier XML depuis un script shell. Dans mon
script, j'utilise un fichier de configuration qui comporte MACHINE IP
PROJET de type :

TOTO 192.168.0.1 XML01
TATA 192.168.0.2 XML01
TOTO 192.168.0.3 XML01


Je souhaite obtenir un fichier comme celui-ci :

<root>

<UN="XML01" Machine="TOTO" />
<UN="XML01" Machine="TATA" />

<DEUX="TOTO" >
<TROIS="PIF" IP="192.168.0.1" QUATRE="POUF"/>
<TROIS="PIF" IP="192.168.0.3" QUATRE="POUF"/>
</DEUX>

<DEUX="TATA" >
<TROIS="PIF" IP="192.168.0.2" QUATRE="POUF"/>
</DEUX>

</root>
[...]



awk '
{
a[$1] = a[$1] "<TROIS="PIF" IP="" $2 "" QUATRE="POUF"/>n"
b[$1] = $3
}
END {
print "<root>n"
for (i in a)
print "<UN="" b[i] "" Machine="" i "" />"
print ""
for (i in a)
printf "<DEUX="%s" >n%s</DEUX>nn", i, a[i]
print "</root>"
}' < input > output


--
Stéphane


Avatar
azerty
Stephane Chazelas wrote:
[...]

awk '
{
a[$1] = a[$1] "<TROIS="PIF" IP="" $2 "" QUATRE="POUF"/>n"
b[$1] = $3
}
END {
print "<root>n"
for (i in a)
print "<UN="" b[i] "" Machine="" i "" />"
print ""
for (i in a)
printf "<DEUX="%s" >n%s</DEUX>nn", i, a[i]
print "</root>"
}' < input > output



Impeccable, merci Stéphane Je ne m'attendais pas à avoir une réponse si
rapide. :)

J'y suis allé doucement ne pensant pas avoir une réponse si rapide.

Peux-tu m'indiquer ce que ça donne avec une donnée supplementaire ?

TOTO 192.168.0.1 XML01 SCRIPT01
TATA 192.168.0.2 XML01 SCRIPT01
TOTO 192.168.0.3 XML01 SCRIPT02

De la forme :

<root>

<UN="XML01" Machine="TOTO" />
<UN="XML01" Machine="TATA" />

<DEUX="TOTO" >
<TROIS="PIF" IP="192.168.0.1" QUATRE="POUF"/>
<TROIS="PIF" IP="192.168.0.3" QUATRE="POUF"/>
</DEUX>

<DEUX="TATA" >
<TROIS="PIF" IP="192.168.0.2" QUATRE="POUF"/>
</DEUX>

<CINQ="PIF" IP="192.168.0.1" >
<SIX="SCRIPT01" />
</CINQ>

<CINQ="PIF" IP="192.168.0.2" >
<SIX="SCRIPT01" />
</CINQ>

<CINQ="PIF" IP="192.168.0.2" >
<SIX="SCRIPT02" />
</CINQ>

</root>

Merci encore.

Avatar
azerty
azerty wrote:
Stephane Chazelas wrote:
[...]

awk '
{
a[$1] = a[$1] "<TROIS="PIF" IP="" $2 "" QUATRE="POUF"/>n"
b[$1] = $3
}
END {
print "<root>n"
for (i in a)
print "<UN="" b[i] "" Machine="" i "" />"
print ""
for (i in a)
printf "<DEUX="%s" >n%s</DEUX>nn", i, a[i]
print "</root>"
}' < input > output



Impeccable, merci Stéphane Je ne m'attendais pas à avoir une réponse si
rapide. :)

J'y suis allé doucement ne pensant pas avoir une réponse si rapide.

Peux-tu m'indiquer ce que ça donne avec une donnée supplementaire ?


Soit un fichier texte contenant :

UN DEUX TROIS QUATRE CINQ SIX
[...]

Ou pour x fois UN il peut y avoir plusieurs DEUX, TROIS, QUATRE, etc.

La structure doit être celle-ci :

<root>

<VILLE="TROIS" NOM="UN" />
[...]

<PRENOM="DEUX" >
<CODE="QUATRE" PRENOM="DEUX" PAYS="QUATRE"/>
[...]
</PRENOM>

[...]

<CODE="QUATRE" NOM="DEUX" >
<AGE="SIX" />
[...]
</CODE>

[...]

</root>

Le script peut etre en shell ou en perl.

Merci.