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

[RECH] Logiciel XML -> csv ou tab

27 réponses
Avatar
benoit.sansspam
Bonjour/soir

Devant la recrudescence de l'utilisation des fichiers xml au sein de
la communauté des développeurs Mac (et je les comprends et félicitent).
Je cherche et ne trouve point un utilitaire qui permette de transformer
un fichier xml en texte tabulé ou .cvs et réciproquement.

J'ai commencé à jeter un ½il à xlt & xslt mais là pour le coup ça me
dépasse complètement. Alors s'il y a des pointeurs dans l'air...

Ah Que merci


--
Nos émissions ont pour vocation de rendre le cerveau disponible :
c'est-à-dire de le divertir, de le détendre pour le préparer entre
deux pubs. Ce que nous vendons à Coca-Cola, c'est du temps de cerveau
humain disponible. (P. Le Lay - TF1)

7 réponses

1 2 3
Avatar
benoit.sansspam
Paul Gaborit wrote:

Ok. Donc si vous nous donnez un exemple de fichier XML ou mieux une DTD ou un
schéma décrivant le format XML des fichiers que vous voulez convertir ainsi
qu'un exemple de résultat attendu, il est possible de concevoir la moulinette
qui le fera (le plus générique consisterait à utiliser XSLT).


Oui mais ceux qui proposent les plist comme stockage n'offrent pas de
DTD autant que je sache. Donc si je prends un extrait d'une appli qui
gère des livres et stocke les infos dans une plist dont je veux extraire
une partie des infos, les retraiter pour ensuite créer une bdd
importable sur Palm sans passer par quatre étapes manuelles, comme c'est
le cas actuellement dans la majorité des applis, export de la base puis
ouverture dans Excel pour supprimer les colonnes inutiles puis ouverture
dans BBedit pour tout ramener en asccii pur pour virer les accents & co
et enfin lancer une appli qui traduit cela au format de la base pour le
Palm.

Donc pour l'exemple je te donne juste le début de ma base (c'est
loooong) histoire d'atteindre le premier bouquin :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Last ID</key>
<integer>1</integer>
<key>NextTrack</key>
<integer>5</integer>
<key>Playlists</key>
<array>
<dict>
<key>Last Selected Column</key>
<string>MyRating</string>
<key>Name</key>
<string>Library</string>
<key>Playlist Items</key>
<array>
<integer>4</integer>
<integer>2</integer>
<integer>1</integer>
</array>
<key>sortDescending</key>
<false/>
</dict>
<dict>
<key>Name</key>
<string>Borrowed</string>
<key>Playlist Items</key>
<array/>
</dict>
<dict>
<key>Name</key>
<string>Wish List</string>
<key>Playlist Items</key>
<array/>
</dict>
</array>
<key>Tracks</key>
<dict>
<key>1</key>
<dict>
<key>Asin</key>
<string>3908247578</string>
<key>AskingPrice</key>
<string></string>
<key>Author</key>
<string>Annelies Strba</string>
<key>Awards</key>
<string></string>
<key>Buyer</key>
<string></string>
<key>BuyerAddress</key>
<string></string>
<key>BuyerEmail</key>
<string></string>
<key>Children</key>
<string></string>
<key>Collection</key>
<string></string>
<key>Comments</key>
<string></string>
<key>Condition</key>
<string></string>
<key>CustomFour</key>
<string></string>
<key>CustomOne</key>
<string></string>
<key>CustomThree</key>
<string></string>
<key>CustomTwo</key>
<string></string>
<key>Date</key>
<string>22 Sep, 2004</string>
<key>Dewey</key>
<string></string>
<key>Dimensions</key>
<string></string>
<key>Display Gone</key>
<integer>0</integer>
<key>Edition</key>
<string></string>
<key>Editor</key>
<string></string>
<key>Format</key>
<string>Hardcover</string>
<key>Genre</key>
<string>Art</string>
<key>Gift</key>
<string></string>
<key>ISBN</key>
<string>3908247578</string>
<key>Illustrator</key>
<string></string>
<key>Image</key>
<string>1.jpg</string>
<key>LCCN</key>
<string></string>
<key>LastRead</key>
<string></string>
<key>LentDate</key>
<string></string>
<key>LentTo</key>
<string></string>
<key>ListPrice</key>
<string>$85.00</string>
<key>Location</key>
<string></string>
<key>MarketPrice</key>
<string></string>
<key>MyRating</key>
<integer>5</integer>
<key>Notes</key>
<string></string>
<key>OnSale</key>
<false/>
<key>PageMark</key>
<string></string>
<key>Pages</key>
<string>160</string>
<key>PaidPrice</key>
<string></string>
<key>Place</key>
<string></string>
<key>Placed</key>
<string></string>
<key>ProductURL</key>
<string>http://www.amazon.com/exec/obidos/ASIN/3908247578/ldvd-20?dev-t D2DIZI2F05UV9S%26camp 25%26link_code=xm2</string>
<key>Publisher</key>
<string>Scalo Verlag Ac</string>
<key>PurchasedAt</key>
<string></string>
<key>PurchasedOn</key>
<string></string>
<key>ReaderRating</key>
<string></string>
<key>Release</key>
<string>15 Oct 2002</string>
<key>Returned</key>
<false/>
<key>Series</key>
<string></string>
<key>Signed</key>
<false/>
<key>Sold</key>
<false/>
<key>SoldOn</key>
<string></string>
<key>SoldPrice</key>
<string></string>
<key>Subjects</key>
<string></string>
<key>Summary</key>
<string></string>
<key>Title</key>
<string>Annelies Strba: Aya</string>
<key>Translator</key>
<string></string>
</dict>
...
En espérant l'avoir coupé au bon endroit parce que là pour le coup en
récupérant un dump de Property List Editor dans MacSoup (j'aurai dû
passer par BBedit mais bon).


--
Nos émissions ont pour vocation de rendre le cerveau disponible :
c'est-à-dire de le divertir, de le détendre pour le préparer entre
deux pubs. Ce que nous vendons à Coca-Cola, c'est du temps de cerveau
humain disponible. (P. Le Lay - TF1)

Avatar
lucsky
Paul Gaborit wrote:

Le problème est que rien ne garantit qu'une plist quelconque peut-être
convertit en une simple liste à plat


Ce que sous entend mon "si la hierarchie de conteneurs du fichier plist
le permet". :)

La question initiale est beaucoup trop vague en fait. S'il s'agit de
convertir un fichier plist *arbitraire*, quel qu'il soit, la meilleure
solution reste XSLT à mon avis. Ou effectivement passer par une API ou
un langage qui permet de manipuler les plist facilement (du genre de ce
qui a été déjà cité dans l'enfilade).

Mais s'il s'agit de convertir un type fichier plist *restreint* dont la
hiérarchie est limitée et dont la sémantique du contenu est connue,
alors passer par une représentation intermédiaire simplifiée (type
plist-text) pourrait éventuellement permettre à Benoît de se passer de
XSLT.

--
Luc Heinrich -

Avatar
benoit.sansspam
Luc Heinrich wrote:

Mais s'il s'agit de convertir un type fichier plist *restreint* dont la
hiérarchie est limitée et dont la sémantique du contenu est connue,
alors passer par une représentation intermédiaire simplifiée (type
plist-text) pourrait éventuellement permettre à Benoît de se passer de
XSLT.


Absolument Luc. Mais on peut pousser le bouchon plus loin en
présentant les types découverts et offrir le choix de sélection à
exporter, et l'ordre qui plus est. Ce qui permet de faire une appli un
peu plus générique et sauvegarder des fichiers de traitement de plist en
fonction des applis visées et des traitements prévues.

Histoire de fumer grave tu peux stocker dans les prefs les choix
effectuer et à chaque ouverture de fichier puisque tu détectes les types
de data tu peux les mapper avec des choix déja effectuer et juste
proposer des choix déjà effectuer voire automatiser la procédure.

Genre si je détecte « Réalisateur, Acteur, ... » et seulement ceux là
il s'agit obligatoirement de l'export nommé « Film » par le user et
j'applique donc son modèle d'export. Si ce n'est pas le cas on repasse
par la case départ, si ils sont tous là mais il y en a plus (upgrade de
l'appli ayant généré la plist) je lui propose de me mettre à jour, je
présente les nouveaux <key>... retour à la case départ ou modèle
d'export conservé. S'il y en a moins idem.

Donc le cas de bdd basiques est tout à fait gérable quant on fume
autre chose que de la SEITA même si ce n'est pas mon cas ;-)


--
Nos émissions ont pour vocation de rendre le cerveau disponible :
c'est-à-dire de le divertir, de le détendre pour le préparer entre
deux pubs. Ce que nous vendons à Coca-Cola, c'est du temps de cerveau
humain disponible. (P. Le Lay - TF1)

Avatar
Paul Gaborit
À (at) Tue, 5 Oct 2004 12:53:07 +0200,
(Benoit Leraillez) écrivait (wrote):
Oui mais ceux qui proposent les plist comme stockage n'offrent pas de
DTD autant que je sache.


Ben si. Ils utilisent la DTD de PropertyList. D'ailleurs le fichier que vous
nous fournissez commence bien par :

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">

Le problème est que pour rendre ce genre de document manipulable par les
bibliothèques standards, les plist n'incluent aucune information sémantique
dans le balisage. Les balises ne servent qu'à organiser une hiérarchie de
données. On ne sait pas si ces données sont en rapport avec une base de
données de livres, le préférences d'un soft ou les dates de vaccinations du
chat. La DTD PropertyList est donc trop générique pour permettre une
extraction sémantique des données.

Donc si je prends un extrait d'une appli qui gère des livres et stocke les
infos dans une plist dont je veux extraire une partie des infos, les
retraiter pour ensuite créer une bdd importable sur Palm sans passer par
quatre étapes manuelles, comme c'est le cas actuellement dans la majorité
des applis, export de la base puis ouverture dans Excel pour supprimer les
colonnes inutiles puis ouverture dans BBedit pour tout ramener en asccii pur
pour virer les accents & co et enfin lancer une appli qui traduit cela au
format de la base pour le Palm.

Donc pour l'exemple je te donne juste le début de ma base (c'est
loooong) histoire d'atteindre le premier bouquin :


[... extrait d'un fichier plist ...]

Ok (le plus simple serait tout de même de dooner un lien vers un fichier
complet).

Mais qu'attendez-vous en sortie (en supposant qu'on parte de cet exemple) ?
Quels champs ? Dans quel ordre ? Quel encodage ? Regoupés comment ? etc.

De plus, cet exemple n'est pas assez complet. Par exemple, que se passe-t-il
quand il y a plusieurs auteurs ?

Voit-on :

....
<key>Author</key>
<string>Annelies Strba</string>
<key>Author</key>
<string>nom 2e auteur</string>
<key>Author</key>
<string>nom 3e auteur</string>
...

ou :
...
<key>Author</key>
<string>Annelies Strba, nom 2e auteur, nom 3e auteur</string>
...

ou autre chose ?

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>

Avatar
benoit.sansspam
Paul Gaborit wrote:

Ben si. Ils utilisent la DTD de PropertyList. D'ailleurs le fichier que vous
nous fournissez commence bien par :


Oui, ça je l'avais vu, je sais lire ;-)

Le problème est que pour rendre ce genre de document manipulable par les
bibliothèques standards, les plist n'incluent aucune information sémantique
dans le balisage. Les balises ne servent qu'à organiser une hiérarchie de
données. On ne sait pas si ces données sont en rapport avec une base de
données de livres, le préférences d'un soft ou les dates de vaccinations du
chat. La DTD PropertyList est donc trop générique pour permettre une
extraction sémantique des données.


On sait ce avec quoi ces données font références en fonction du lieu
où on les récupère. À date elles sont dans des dossiers dans
~user/Library/Appli/ en attendant qu'ils fassent des bundles à la
Keynote (auquel cas ce sera plus simple car on pourra connaître le type
de données en fonction de l'extension du fichier (j'ai le droit de
rêver non ? ;-)

Sinon je te suis un peu sauf sur un point, une appli qui génère un
fichier de pref de 1 Mo...

Donc si je prends un extrait d'une appli qui gère des livres et stocke les
infos dans une plist dont je veux extraire une partie des infos, les
retraiter pour ensuite créer une bdd importable sur Palm sans passer par
quatre étapes manuelles, comme c'est le cas actuellement dans la majorité
des applis, export de la base puis ouverture dans Excel pour supprimer les
colonnes inutiles puis ouverture dans BBedit pour tout ramener en asccii pur
pour virer les accents & co et enfin lancer une appli qui traduit cela au
format de la base pour le Palm.

Donc pour l'exemple je te donne juste le début de ma base (c'est
loooong) histoire d'atteindre le premier bouquin :


[... extrait d'un fichier plist ...]

Ok (le plus simple serait tout de même de dooner un lien vers un fichier
complet).

Mais qu'attendez-vous en sortie (en supposant qu'on parte de cet exemple) ?
Quels champs ? Dans quel ordre ? Quel encodage ? Regoupés comment ? etc.


Je veux pouvoir extraire de la « base » d'origine les infos
pertinentes que j'ai choisie pour générer une autre base plus classique
et l'importer dans une autre appli ou un Palm sans passer par une
foultitude d'étapes intermédiaires quand les applis ne savent exporter
que la totalité des données. Exemple d'étapes actuellement à exécuter :

- exporter les données
- importer dans excel pour virer les données inutiles et réorganier les
champs dans le bon ordre
- passer le tout dans bbedit pour basculer en ascii pur afin de
supprimer les accents, cédilles & co
- enfin utiliser un outil pour transformer le tout en un document
compatible avec une bdd palm telle JFile (dont j'ai les spec et pour
laquelle une appli OS X existe)

De plus, cet exemple n'est pas assez complet. Par exemple, que se passe-t-il
quand il y a plusieurs auteurs ?

ou autre chose ?


Autre chose : celui qui a fait l'appli pour les livres (pour laquelle
je n'ai que des exemples avec un auteur) a aussi la même appli pour les
DVD et ce qu'il utilise pour acteurs se présente de deux façons. soit
une liste soit un array. La liste lui sert pour affiche la liste des
acteurs alors que l'array lui sert à présenter un tableau
Acteur/Personnage

<key>Starring</key>
<string>Henry Fonda, Claudia Cardinale, Jason Robards, Charles Bronson,
Gabriele Ferzetti, Paolo Stoppa, Woody Strode, Jack Elam, Keenan Wynn,
Frank Wolff, Lionel Stander</string>
<key>Names</key>
<array>
<string>Henry Fonda</string>
<string>Claudia Cardinale</string>
<string>Jason Robards</string>
<string>Charles Bronson</string>
<string>Gabriele Ferzetti</string>
<string>Paolo Stoppa</string>
<string>Woody Strode</string>
<string>Jack Elam</string>
<string>Keenan Wynn</string>
<string>Frank Wolff</string>
<string>Lionel Stander</string>
</array>

Mais je reconnais que ta question est sensée et je me la suis posée
depuis le début. Cela étant je vois mal quelqu'un s'amuser à stocker une
base de donnée à plat sans utiliser les Arrays mais en prenant Acteur1,
Acteur2, ActeurX en fonction des besoins au niveau supérieur. Donc soit
on génère une liste à partir d'un array soit on a réfléchit avant parce
qu'on connaît la base qui sert de référence.

Pour reprendre ta question concernant les listes d'auteurs il est tout
à fait concevable que dans ce cas on préfère générer une string A, B,
C.. à partir d'un array plutot que de créer une arborescence plus
complexe pour ce type d'info.

Si tu veux je peux te faire parvenir par mail un fichier d'exemple (si
tu me donnes ton adresse en écrivant à la mienne qui est un peu plus
valide que la tienne ;-). En tout cas je regarde de plus prés, de mon
côté, l'osax de Smile.


--
Nos émissions ont pour vocation de rendre le cerveau disponible :
c'est-à-dire de le divertir, de le détendre pour le préparer entre
deux pubs. Ce que nous vendons à Coca-Cola, c'est du temps de cerveau
humain disponible. (P. Le Lay - TF1)


Avatar
Paul Gaborit
À (at) Wed, 6 Oct 2004 23:18:45 +0200,
(Benoit Leraillez) écrivait (wrote):
Pour reprendre ta question concernant les listes d'auteurs il est tout
à fait concevable que dans ce cas on préfère générer une string A, B,
C.. à partir d'un array plutot que de créer une arborescence plus
complexe pour ce type d'info.


C'est ce genre de choix qui n'est pas automatisable car dans certains cas, on
préfère dupliquer l'info (autant de lignes que d'auteurs) et dans d'autres, on
préfére agréger l'info (une seule ligne avec un champ auteurs contenant : A,
B, etc.).

Et là, comme on ne peut pas se baser sur la sémantique des balises XML (tous
utilisent 'array'), il faut avoir une information externe comme la provenance
du fichier. C'est là qu'il me semble qu'on perd tout l'intérêt de XML.

Si tu veux je peux te faire parvenir par mail un fichier d'exemple (si
tu me donnes ton adresse en écrivant à la mienne qui est un peu plus
valide que la tienne ;-). En tout cas je regarde de plus prés, de mon
côté, l'osax de Smile.


L'adresse du champ "Reply-to" de mes messages est tout à fait valide...

Après, on peut faire beaucoup de chose avec les outils fournis par MacOS
X. Malheureusement, ils sont incomplètement installés (du point de vue outil
de traitement XML) :

- libxml2 existe bien mais il n'y a pas libxslt (ni xsltproc).
- perl (5.8) est bien là mais sans aucun module XML.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>

Avatar
francois.jacquemin
Benoit Leraillez wrote:

- En XML standard <atom>Hydrogène<atom> on dit que ce qui suit est un
atom.

- En XML plist <key>atom<key><string>Hydrogène<string> on dit toujours
que ce qui suit est dans la "catégorie" atom qui est du type texte brute
dont le contenu est «atom » le type aurait pu être booléen, entier,
nombre, liste... Bref on a toujours une hierarchie à deux niveau à plat
à la fin pour avoir l'info et il faut chercher un <key> et prendre le le
tag qui suit pour obtenir les données :-/

Pfouuuuu ! Si tous les dév sont obligés de passer par là pour gérer
leurs prefs pourquoi aucun n'a fait une petite appli pour qu'on puisse
jouer avec ;-)

J'ai un copain qui a plus de 900 règles dans mail car ceraines datent
d'eMailer, alors... et il voudrait faire le ménage là-dedans mais ce
n'est pasle format XML plist qui permet d'y voir clair.


Il me vient une idée : la plist n'est-elle transformable en format
"standard" selon ton exemple par un simple fichier XSL ? Le XSL n'a-t-il
pas pour but initial de transformer un arbre XML source en arbre XML
cible ? Et pas forcément en XHTML ? Rendez-vous sur :
<http://www.w3schools.com/xsl/xsl_transformation.asp>
--
F. Jacquemin

1 2 3