Convertir XML en NDJSON

Vous pouvez convertir XML en NDJSON gratuitement et sans compte : déposez le fichier ci-dessus et, une ou deux secondes plus tard, le résultat est prêt à télécharger. La conversion se fait dans votre propre navigateur : le fichier n’est donc jamais téléversé. Cela marche sous Windows, macOS et Linux comme sur iPhone et Android, et continue de marcher si vous coupez le réseau.

  • Où cela s’exécute Dans votre navigateur. Le fichier n’est pas téléversé.
  • Reconstruit NDJSON ne fonctionne pas comme XML. Il ne s’agit donc pas de la dégradation progressive d’un codec avec perte : ce que NDJSON sait exprimer est reproduit fidèlement, et ce qui n’y a pas d’équivalent ne subsiste pas du tout.
  • Limite de taille Jusqu’à 100 Mo par fichier, gratuitement et sans compte.
  • Bon à savoir Les attributs et les nœuds de texte XML deviennent tous deux des clés, ce qui est un arbitrage que le convertisseur fait à votre place.

Jusqu’à 100 fichiers à la fois. Les formats mélangés ne posent pas de problème.

Pourquoi un document XML devient toujours exactement une ligne

Le NDJSON a besoin de quelque chose sur quoi se découper, et la découpe se fait ici sur une liste à l’extérieur des données analysées. L’analyse XML n’en produit jamais : le résultat est toujours un objet avec une seule clé, le nom de l’élément racine, contenant tout le reste. Une valeur en entrée, une ligne en sortie.

Cela vaut quelle que soit la taille du fichier et quel que soit le nombre d’éléments répétés qu’il contient. Un export de 40 Mo contenant dix mille enregistrements se convertit en une seule ligne de 40 Mo. Rien n’est perdu et rien n’est découpé, et si ce dont vous aviez besoin était dix mille lignes, cette conversion ne l’a pas fait.

Obtenir une ligne par enregistrement depuis un export XML

La voie qui fonctionne est en deux étapes. Convertissez le fichier en JSON, puis passez-le dans jq : sélectionnez le chemin qui contient l’élément répété, itérez dessus, et utilisez l’option de sortie compacte pour que chaque objet atterrisse sur sa propre ligne. C’est une seule commande, c’est répétable dans un script, et cela met le choix de ce qui compte comme enregistrement là où il doit être — chez vous.

Aucun convertisseur ne peut faire ce choix depuis le document seul. Dans un flux RSS, l’enregistrement est l’élément item ; dans une réponse SOAP, c’est peut-être une ligne trois niveaux à l’intérieur du corps ; dans un export bancaire, c’est ce que le fournisseur a décidé d’appeler une transaction. Un outil qui devinerait aurait raison assez souvent pour être cru et faux assez souvent pour corrompre un chargement.

Les cas où une ligne par fichier est exactement la bonne forme

Cette paire n’est pas sans usage. Si vos entrées sont beaucoup de petits documents XML plutôt qu’un grand seul — un répertoire de factures, un dossier de manifestes, un lot de charges utiles par événement — alors une ligne par fichier est précisément la forme que veut un chargeur, et concaténer les sorties produit un flux NDJSON valide avec un enregistrement par document source.

Cela fonctionne aussi pour l’inventaire. Convertir chaque fichier de config d’un dépôt et ajouter les lignes à la suite vous donne un jeu de données requêtable de ce que ces fichiers contiennent, ce qui est une chose réellement utile à avoir et difficile à obtenir autrement. Dans les deux cas, la conversion fait son travail et la ligne unique est la fonctionnalité.

Le problème de forme qui suit un enregistrement XML dans le JSON

Même après avoir découpé les enregistrements, un comportement XML les suit. Un élément répété ne devient un tableau que lorsqu’il se répète : un enregistrement contenant un élément tag produit une chaîne, et un enregistrement en contenant deux produit une liste de chaînes. À l’intérieur d’un même export, certaines lignes auront le tableau et d’autres non.

Un magasin en schema-on-read inférera un type depuis les premiers enregistrements qu’il voit, puis rejettera ou contraindra les autres. La correction appartient au passage jq plutôt qu’au chargeur : normalisez en tableau chaque champ qui peut se répéter pendant que vous émettez chaque ligne, pour que le flux soit uniforme avant que quoi que ce soit en aval ne le voie.

Ce que la ligne contient réellement

Du JSON compact sans indentation, des clés dans l’ordre du document, terminé par un saut de ligne. Les attributs apparaissent comme des clés préfixées par @ et le texte d’un élément qui a aussi des attributs apparaît sous #text. Un préfixe d’espace de noms reste à l’intérieur du nom de clé, donc soap:Body est une clé avec deux-points dedans, et un document avec une déclaration XML porte une clé de premier niveau supplémentaire nommée ?xml.

Ces deux derniers méritent d’être retirés avant un chargement. Des noms de champ contenant des deux-points et des points d’interrogation sont maladroits ou invalides dans bon nombre de moteurs de requête et de schémas de table, et la déclaration est une métadonnée sur le fichier plutôt qu’une donnée du fichier.

Les types tels qu’ils arrivent d’un analyseur XML

Les valeurs d’apparence numérique sont analysées, dans les attributs comme dans le texte des éléments. C’est commode pour un compte et destructeur pour des identifiants : une référence de commande écrite 007 arrive en tant que nombre 7, et un attribut version écrit 1.0 arrive en 1. Dans un entrepôt de données, ces valeurs deviennent des colonnes numériques et le remplissage initial a disparu de chaque ligne.

Un cas se comporte mieux qu’on ne le craindrait : un entier trop long pour survivre comme nombre JSON est laissé comme chaîne plutôt qu’arrondi, donc une référence à dix-neuf chiffres arrive intacte. La notation scientifique n’a pas cette protection — une valeur écrite 1e3 arrive comme 1000. Rien ne déclenche d’erreur dans les deux cas. Si l’export contient des numéros de référence sur lesquels vous ferez des jointures plus tard, reconvertissez-les en chaînes dans le passage jq, avant le premier chargement plutôt qu’après.

Charger le résultat, et la longueur de ligne que personne ne prévoit

NDJSON est lu directement par jq, par pandas avec son option lines, et comme format de chargement par les chargeurs d’entrepôts courants. Elasticsearch en bloc a besoin d’une ligne d’action avant chaque document, ce qui s’ajoute dans le même passage jq qui découpe les enregistrements.

Ce qu’il faut prévoir avec cette paire spécifiquement est la longueur de ligne. Un lecteur qui traite une ligne à la fois doit garder cette ligne entière en mémoire, donc une ligne de document entier est un tampon de document entier, et toute limite de taille par enregistrement dans la destination s’applique au fichier complet plutôt qu’à un enregistrement. C’est la raison pratique de découper les enregistrements avant le chargement plutôt qu’après.

Quand un analyseur XML en flux est la bonne réponse à la place

Si l’export est gros, arrive régulièrement et doit devenir un flux à chaque fois, la recommandation honnête n’est pas du tout un convertisseur de navigateur. Un analyseur en flux lit un fichier XML élément par élément sans construire l’arbre entier en mémoire, et émettre une ligne JSON par enregistrement depuis cette boucle est un programme court dans n’importe quel langage.

Cette approche survit aussi aux fichiers plus grands que la mémoire, ce que rien sur cette page ne fait — l’analyse ici construit le document entier comme objets JavaScript avant qu’un seul octet ne soit écrit. Pour un fichier ponctuel, ou pour les cas par fichier ci-dessus, le convertisseur est plus rapide que d’écrire le programme. Pour un pipeline récurrent, il ne l’est pas.

Les commentaires, et ce qu’un fichier délimité par lignes ne peut pas contenir

Les commentaires XML sont supprimés pendant l’analyse et NDJSON n’a pas de syntaxe de commentaires pour les recevoir, donc toute documentation à l’intérieur de l’export a disparu. Il n’y a pas non plus d’en-tête, pas de schéma et pas de préambule : chaque ligne d’un fichier NDJSON est un enregistrement, et un chargeur essaiera de lire tout ce qui se trouve en haut du fichier comme tel.

Si le chargement a besoin d’enregistrer d’où viennent les données, cela appartient à un champ de l’enregistrement ou au nom de fichier. L’ajouter comme première ligne rend le fichier invalide pour son propos, et le chargeur vous le dira d’une manière bien moins claire que ce paragraphe.

Comment convertir XML en NDJSON

  1. Déposez votre fichier XML sur cette page, ou cliquez pour en choisir un.
  2. Choisissez NDJSON comme destination. La conversion se fait dans votre navigateur et le fichier n’est pas téléversé.
  3. Téléchargez le fichier NDJSON terminé.

XML et NDJSON : ce qui change

XML face à NDJSON
XMLNDJSON
Nom completExtensible Markup LanguageNewline-Delimited JSON
Extension de fichier.xml.ndjson, .jsonl
Type de médiaapplication/xmlapplication/x-ndjson
Première publication19982013
Publié parW3C
SpécificationXML 1.0
LicenceStandard ouvertStandard ouvert
Situation actuelleActuelActuel
S’ouvre dans un navigateurTous les navigateursAucun navigateur
Envisagé à la placeJSON, YAMLJSON, CSV

Ce qui est perdu

Les commentaires ne suivent pas. XML permet d’annoter un fichier et NDJSON n’a aucune syntaxe pour cela : chaque ligne d’explication disparaît, et cela touche précisément les fichiers que l’on commente, c’est-à-dire la configuration qu’un autre devra maintenir.

Ouvrir le résultat

Aucun navigateur ne lit NDJSON. C’est le moins portable des deux : mieux vaut s’assurer que le destinataire l’accepte avant de l’envoyer.

Les logiciels habituels ne se recoupent pas : XML s’ouvre dans Visual Studio Code et oXygen XML Editor, NDJSON dans jq et pandas — celui qui reçoit le résultat a donc besoin d’un logiciel de la seconde liste.

À quoi sert chaque format

XML est le format de W3C, publié en 1998. La spécification est XML 1.0, et elle mérite d’être connue si le fichier doit survivre à l’outil qui l’a écrit.

NDJSON date de 2013. jq et pandas le lisent.

XML a été publié en 1998 et NDJSON en 2013. Le plus ancien est en général le fichier le plus sûr à remettre ; le plus récent fait le même travail en moins d’octets.

De XML à NDJSON : questions fréquentes

Mon fichier XML est-il téléversé quelque part ?

Non. Cette conversion se fait entièrement dans votre navigateur : le fichier ne quitte donc pas votre appareil. Vous pouvez le vérifier vous-même — ouvrez l’onglet réseau des outils de développement et convertissez quelque chose. Vous verrez la page elle-même et les requêtes de statistiques et de publicité qui financent ce service, et pas une seule qui transporte votre fichier.

Convertir XML en NDJSON est-il gratuit ?

Oui. Pas de compte, pas de filigrane et pas de quota journalier à dépenser : cela tourne sur votre propre machine, vous pouvez donc revenir autant de fois que vous voulez. Le navigateur traite des fichiers jusqu’à 100 Mo, 100 à la fois.

Y a-t-il une perte de qualité en convertissant XML en NDJSON ?

XML et NDJSON décrivent le contenu de façons radicalement différentes. La conversion est donc une reconstitution et non une copie : fidèle, mais pas identique octet pour octet. Les attributs et les nœuds de texte XML deviennent tous deux des clés, ce qui est un arbitrage que le convertisseur fait à votre place.

Un fichier NDJSON s’ouvre-t-il dans un navigateur ?

Aucun navigateur ne lit NDJSON. C’est le moins portable des deux : mieux vaut s’assurer que le destinataire l’accepte avant de l’envoyer.

Les commentaires survivent-ils de XML à NDJSON ?

Les commentaires ne suivent pas. XML permet d’annoter un fichier et NDJSON n’a aucune syntaxe pour cela : chaque ligne d’explication disparaît, et cela touche précisément les fichiers que l’on commente, c’est-à-dire la configuration qu’un autre devra maintenir.

En savoir plus sur ces formats