Transformer du XML en CSV



Documents pareils
Nouvelle version de Zonecheck, la 3.0, avec tests DNSSEC

Master d Informatique Corrigé du partiel novembre 2010

Présentation du langage et premières fonctions

Production de documents avec XSLT. Production de documents p.1/??

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

A.-M. Cubat PMB - Import de notices à partir d un tableur Page 1 Source :

Séance 1 Introduction aux bases de données

Paris Airports - Web API Airports Path finding

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

L'API DOM : Document Object Model

Initiation à la programmation en Python

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Convertisseur BBAN/IBAN

Modules Prestashop - ExportCatalogue / EXPORT IMPORT POUR MODIFICATIONS EN MASSE DANS PRESTASHOP VERSION Optim'Informatique

A.-M. Cubat PMB - Import de lecteurs - Généralités Page 1 Source :

Dans l'article précédent, vous avez appris

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8

<?xml version="1.0" encoding="iso " standalone="yes"?>

Table des matières. 1. Installation de VMware ESXI Pré-requis Installation... 3

Server-side XML. PAS FINI... mais ok pour un début. Originaux. Auteurs et version. Prérequis: Java de base, servlets, GUI et XML

Module 7 : Configuration du serveur WEB Apache

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

THEME PROJET D ELABORATION D UNE BASE DE DONNEES SOUS LE SERVEUR MYSQL

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Chapitre 2 Devine mon nombre!

FAQ Import Version 1.2

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Vue d ensemble de Windows PowerShell

TP 1. Prise en main du langage Python

Import automatique des places de parking - Handicap.fr

Comment créer et administrer une campagne?

BIRT (Business Intelligence and Reporting Tools)

Alfstore workflow framework Spécification technique

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Olivier Mondet

WINDOWS SHAREPOINT SERVICES 2007

WDpStats Procédure d installation

calls.paris-neuroscience.fr Tutoriel pour Candidatures en ligne *** Online Applications Tutorial

Cours d algorithmique pour la classe de 2nde

Algorithmique et programmation : les bases (VBA) Corrigé

Comment bien débuter sa consolidation?

Enseignement secondaire technique

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Utilisation d objets : String et ArrayList

Plateforme PAYZEN. Définition de Web-services

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

F. Barthélemy. 17 mai 2005

L export de SAS vers Excel expliqué à ma fille

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Déploiement de SAS Foundation

AWS avancé. Surveiller votre utilisation d EC2

Algorithmique et Programmation, IMA

Document de spécification du logiciel VALPO Définition du format des fichiers des

WEB page builder and server for SCADA applications usable from a WEB navigator

Guide Utilisateur ACQUIT : Anomalies issues du Guichet XML

Cours 3 : Python, les conditions

sshgate Patrick Guiran Chef de projet support

Lesson Plan Physical Descriptions. belle vieille grande petite grosse laide mignonne jolie. beau vieux grand petit gros laid mignon

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

esms Desktop Guide de l utilisateur

INTELLIGENCE ECONOMIQUE : ENJEUX ET RETOUR D EXPERIENCE PILOTE DANS SEPT PMI DE BOURGOGNE

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15


Programmation Web. Madalina Croitoru IUT Montpellier

Once the installation is complete, you can delete the temporary Zip files..

Contents Windows

2 Comment fonctionne un ordinateur, dans les grandes lignes

Spécifications techniques et fonctionnelles du multi-années pour les noms de domaine en.fr

OpenPaaS Le réseau social d'entreprise

Gestion mémoire et Représentation intermédiaire

Document Object Model (DOM)

LA BANQUE POSTALE MISE SUR LE MARKETING TEMPS- REEL ET L IMPRESSION 3D

SERVEUR DÉDIÉ DOCUMENTATION

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

lundi 3 août 2009 Choose your language What is Document Connection for Mac? Communautés Numériques L informatique à la portée du Grand Public

Recherche dans un tableau

Création de Sous-Formulaires

Exercices sur SQL server 2000

des Données et Référentiels sur l'eau Service d'administration Nationale

MODERN LANGUAGES DEPARTMENT

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Présentation Windows Azure Hadoop Big Data - BI

Classes et Objets en Ocaml.

SII Stage d informatique pour l ingénieur

PIVOT. Pivot/Querier Documentation technique XML/XSD/XSLT

L ABC de l acquisition de petites entreprises

OCL - Object Constraint Language

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Androïd Manuel d installation MB PRO LIGHT Préalable. Définitions

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Fiche produit ifinance v4

Transcription:

Transformer du XML en CSV Stéphane Bortzmeyer <stephane+blog@bortzmeyer.org> Première rédaction de cet article le 22 décembre 2006. Dernière mise à jour le 23 janvier 2007 Issues d une question posée sur la liste XML-fr <http://xmlfr.org/listes/>, voici trois façons possibles de traduire un fichier du format XML vers le format CSV. Une précision, tout d abord, puisque cet article reçoit beaucoup de visites d utilisateur d un moteur de recherche qui ont simplement tapé convertir du xml en csv dans ce dernier ; toutes ces méthodes impliquent de programmer. Il n est pas possible de trouver un programme tout fait qui convertisse n importe quel fichier XML en CSV, car les modèles de données sont trop différents. Notons d abord que le format CSV, décrit dans le RFC 4180 1, n est pas structuré : on ne peut pas mettre des tuples dans d autres tuples, contrairement à ce que permettent des formats hiérarchiques comme XML ou JSON. D une manière générale, si un élément XML peut apparaitre plusieurs fois, la traduction en CSV va être problématique. Prenons par exemple de fichier XML des langues parlées au Sénégal (j ai utilisé les informations publiées par SIL). : <!-- http://www.ethnologue.com/ and ISO 639-2. Le nombre de locuteurs (très approximatif) est en milliers. --> <languages> <code>wo</code> <name>wolof</name> <name>ouolof</name> <speakers>3568</speakers> <speakers>607</speakers> <name>manding</name> 1. Pour voir le RFC de numéro NNN, http://www.ietf.org/rfc/rfcnnn.txt, par exemple http://www.ietf.org/ rfc/rfc4180.txt 1

2 <name>mandinka</name> <code>man</code> <code>dyo</code> <speakers>293</speakers> <name>jola-fonyi</name> <code>snk</code><name>soninke</name><speakers>194</speakers> </languages> Si on veut le traduire en CSV, on devra choisir comment placer les différents noms, chaque langue pouvant en avoir plusieurs. Une solution courante est de les mettre dans une seule case, séparé par un autre séparateur (par exemple un point-virgule si le séparateur principal est une virgule). Ici, nous allons simplifier le problème en ne mettant qu un nom par langue : <!-- http://www.ethnologue.com/ and ISO 639-2. Le nombre de locuteurs (très approximatif) est en milliers. --> <languages> <code>wo</code> <name>wolof</name> <speakers>3568</speakers> <speakers>607</speakers> <name>manding</name> <code>man</code> <code>dyo</code> <speakers>293</speakers> <name>jola-fonyi</name> <code>snk</code><name>soninke</name><speakers>194</speakers> </languages> La première technique employée sera XSLT, un langage déclaratif. Notre script sera : <!DOCTYPE stylesheet [ <!ENTITY newln " "> ]> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version= 1.0 > <xsl:output method="text" encoding="utf-8"/> <xsl:template match="languages"> <xsl:apply-templates/>

3 <xsl:template match="language"> <xsl:apply-templates select="code"/> <xsl:text>,</xsl:text> <xsl:apply-templates select="name"/> <xsl:text>,</xsl:text> <xsl:apply-templates select="speakers"/> <xsl:text>&newln;</xsl:text> <xsl:template match="name"> <xsl:template match="speakers"> <xsl:template match="code"> <xsl:template match="text()"> <!-- Ignore everything else --> </xsl:stylesheet> Et son utilisation, ici avec xsltproc <http://xmlsoft.org/xslt/> : % xsltproc -o langues.csv langues2csv.xslt langues.xml produira : wo,wolof,3568 man,manding,607 dyo,jola-fonyi,293 snk,soninke,194 Tout le monde n aime pas XSLT. La deuxième méthode va donc utiliser un langage impératif, Python, avec le module ElementTree <http://effbot.org/zone/element-index.htm> : #!/usr/bin/python import celementtree import sys if len(sys.argv) <= 1: raise Exception("Usage: %s xml-file" % sys.argv[0]) filename = sys.argv[1] tree = celementtree.fromstring(open(filename).read()) lang_elements = tree.getiterator("language") for lang in lang_elements: for characteristic in lang: if characteristic.tag == "code": code = characteristic.text elif characteristic.tag == "name": name = characteristic.text elif characteristic.tag == "speakers": speakers = int(characteristic.text) * 1000 print "%s,%s,%i" % (code, name, speakers)

4 Et il donnera quasiment le même fichier CSV (à part qu on a traduit les milliers en unités). Et si on préfère les langages fonctionnels, voici un exemple en Haskell, en utilisant la bibliothèque HaXml <http://www.cs.york.ac.uk/fp/haxml/> : import Text.XML.HaXml import System import IO rootof :: Document -> Element rootof (Document r _) = r nameof :: Element -> Name nameof (Elem n ) = n contentsof :: Element -> [Content] contentsof (Elem cs) = cs textof :: Element -> String textof (Elem cs) = concat (map show cs) instance Show Content where show (CString _ value) = value show (CElem e) = nameof e show _ = "Undefined" showval :: Content -> String showval (CElem e)= textof e firstchild :: Name -> Content -> Content firstchild tagname item = head (concat (map (tag tagname) (children item))) formatcsv :: Content -> String formatcsv l = let code = firstchild "code" l in let name = firstchild "name" l in let speakers = firstchild "speakers" l in showval code ++ "," ++ showval name ++ "," ++ showval speakers main = do myargs <- getargs if (length myargs) == 0 then error "Usage: lang2csv xml-file" else putstr "" let filename = head myargs f <- IO.openFile (filename) IO.ReadMode input <- IO.hGetContents f let xmltree = rootof (xmlparse filename input) let languages = concat (map (tag "language") (contentsof xmltree)) mapm putstrln (map formatcsv languages) Si le fichier XML contient des caractères ennuyeux comme des vraies virgules ou comme des sauts de ligne, il faut prendre d avantage de précautions. Pour les virgules, Alain Couthures conseille : D utiliser le point-virgule comme séparateur, moins fréquent dans les données et que beaucoup de logiciels (comme Excel) acceptent. D échapper les vraies virgules. Il n existe pas de norme pour cela mais encadrer les virgules par des guillemets semble fonctionner avec ledit Excel.

5 Sinon, de remplacer les virgules, par exemple par des points (Excel, encore lui, accepte en entrée un chiffre avec un point décimal, même dans sa version française). En XSLT, un test avec contains() permet de détecter la présence du séparateur dans la donnée et un appel à translate() permet de changer des caractères en autres, comme par exemple tous les, en.. Pour les autres, le mieux est d avoir des données en XML normalisées, conformes à un schéma strict qui interdit les espaces, les sauts de ligne, etc. C est plus facile à dire qu à faire : si on utilise W3C Schema ou bien RelaxNG avec la bibliothèques de types de ces W3C Schemas, on se heurte à une limite (décrite en <http://www.w3.org/tr/2004/rec-xmlschema-2-20041028/#rf-whitespace>). Ces types sont normalisés avant les tests des motifs et il n y a donc pas moyen d éliminer les espaces de début et de fin. Un seul type échappe à cette règle, string et le schéma RelaxNG ci-dessous l utilise avec succès : # XML files that follow this schema do not create problems when # converting to CSV start = element languages {lang+} lang = element language {code & name+ & speakers} code = element code {xsd:string { minlength = "2" maxlength = "3" pattern = "[a-z]+"} } name = element name {xsd:string { pattern="\s.*\s"}} # You have to use xsd:string and not xsd:integer because integer is # normalized so the conditions always succeed. speakers = element speakers {xsd:string {pattern="[0-9]+"}} Un test avec rnv <http://www.davidashen.net/rnv.html> détecte les problèmes facilement. Ici, ligne 8, j ai écrit : <name> Wolof</name> et rnv le détecte : % rnv schema.rnc languages.xml languages.xml languages.xml:8:5: error: invalid data or text not allowed required: data http://www.w3.org/2001/xmlschema-datatypesˆstring Merci à Eric van der Vlist pour son aide inestimable sur ce dernier point. On ne peut pas toujours forcer les fichiers qu on veut convertir à être conforme à un schéma. Souvent, ces fichiers arrivent comme ils sont et on n a pas la possibilité de réclamer. Dans ce cas, c est le programme de conversion qui doit se charger d éliminer ces espaces et sauts de ligne gênants. En XSLT, la fonction normalize-space est très pratique. Si je change mes templates XSLT ainsi : <xsl:template match="name"> <xsl:value-of select="normalize-space(text())"/> plus de problèmes, même si le fichier XML contient des espaces ou des sauts de ligne.