FlowKit

Node XML n8n : convertir du XML en JSON (et inversement) sans surprise

Publié le 5 août 2026 · 7 min de lecture

Le JSON a gagné, mais le XML n'a pas signé sa reddition : API SOAP bancaires ou logistiques, flux produits e-commerce, sitemaps, factures EDI, téléservices d'administrations — en 2026, un intégrateur n8n croise encore du XML toutes les semaines. La bonne nouvelle : le node XML de n8n convertit dans les deux sens, XML → JSON pour parser, JSON → XML pour répondre à un système legacy. La moins bonne : ses options par défaut produisent un JSON dont la forme change selon le contenu du fichier, et c'est la cause numéro un des workflows qui marchent en test et cassent en production. Ce guide couvre le node, ses options, et un pipeline complet flux produits → Google Sheets.

Pourquoi vous croisez encore du XML en 2026

Le XML survit là où les contrats d'interface ont été écrits il y a quinze ans et où personne ne veut payer la migration : web services SOAP (banques, assurances, transporteurs), flux produits des places de marché et comparateurs, sitemaps et flux RSS (un flux RSS est du XML — le node RSS le parse pour vous, mais un flux exotique se traite à la main), échanges EDI et téléprocédures publiques.

Le format a perdu la bataille du web pour des raisons mesurables : l'étude de Nurzhan Nurseitov, Michael Paulson, Randall Reynolds et Clemente Izurieta, « Comparison of JSON and XML Data Interchange Formats: A Case Study » (CAINE, 2009), a montré sur des milliers d'objets transmis que JSON était plus rapide à transmettre et moins gourmand en ressources que XML (voir sur Google Scholar). Plus récemment, J. Gerrans et R. S. Sherratt (IEEE Embedded Systems Letters, 2024) ont mesuré un fichier JSON 24,7 % plus petit que son équivalent XML à données identiques (voir sur Google Scholar). Mais un flux fournisseur ne se renégocie pas : on convertit.

Le mode « XML to JSON » : la donnée doit être une string

Le node XML ne lit ni URL ni fichier : il attend que le XML soit déjà présent comme chaîne de caractères dans un champ de l'item. Sa configuration tient en deux paramètres :

  • Mode : XML to JSON ;
  • Property Name : le nom du champ qui contient la string XML (par défaut data). Le résultat JSON remplace la string dans ce même champ.

En pratique, le XML arrive presque toujours par un node HTTP Request : dans ses options, ajoutez Response → Response Format : Text, pour que le corps de la réponse atterrisse tel quel dans data au lieu d'être interprété. Enchaînez le node XML avec data comme Property Name, et c'est parsé. Si le flux est paginé (certaines API legacy le sont), les techniques de notre guide de la pagination d'API s'appliquent à l'identique — seul le format du corps change.

Les options qui changent tout

Explicit Array : le piège classique

C'est l'option la plus importante du node. Désactivée, le convertisseur simplifie : un élément présent une fois devient un objet, présent plusieurs fois devient un tableau. Le même flux produit donc deux structures différentes selon son contenu :

// 1 seul <produit> dans le flux : objet
{ "catalogue": { "produit": { "nom": "T-shirt coton bio" } } }

// 2 <produit> ou plus : tableau
{ "catalogue": { "produit": [ { "nom": "T-shirt coton bio" }, { "nom": "Mug émaillé" } ] } }

Votre workflow testé sur un flux de 500 produits fonctionne, puis casse le jour creux où le flux n'en contient qu'un. Activez Explicit Array systématiquement : chaque élément enfant devient un tableau, toujours, et le parsing est déterministe. Le prix à payer — des expressions un peu plus verbeuses comme {{ $json.catalogue.produit[0].nom[0] }} — est largement compensé par la stabilité.

Attributs : Attribute Key, Ignore Attributes, Merge Attributes

Le XML porte de la donnée dans les attributs (<produit sku="TSH-001">), un concept sans équivalent JSON. Trois options règlent leur sort :

  • Attribute Key : le préfixe sous lequel les attributs sont regroupés — par défaut $, donc {{ $json.produit['$'].sku }} ;
  • Ignore Attributes : les supprime purement et simplement — à réserver aux flux où ils ne portent rien d'utile ;
  • Merge Attributes : fusionne les attributs avec les éléments enfants au même niveau — sku devient un champ ordinaire à côté de nom, ce qui donne le JSON le plus naturel à manipuler. C'est souvent le meilleur choix, sauf collision de noms entre un attribut et une balise enfant.

Le nettoyage : Trim, Normalize, Explicit Root

Trim retire les espaces en tête et queue des nœuds texte, Normalize normalise les blancs internes — deux options à activer sur les flux indentés à la main où <prix> 24.90 </prix> ferait échouer une conversion numérique. Explicit Root contrôle la présence de l'élément racine dans le résultat ; désactivée, vous économisez un niveau (catalogue) dans toutes vos expressions.

Exemple complet : flux produits XML → Google Sheets

Le flux du fournisseur :

<catalogue>
  <produit sku="TSH-001">
    <nom>T-shirt coton bio</nom>
    <prix>24.90</prix>
    <stock>142</stock>
  </produit>
  <produit sku="MUG-014">
    <nom>Mug émaillé</nom>
    <prix>14.50</prix>
    <stock>0</stock>
  </produit>
</catalogue>

Après HTTP Request (Response Format : Text) puis XML (Explicit Array et Merge Attributes activés) :

{
  "catalogue": {
    "produit": [
      { "sku": "TSH-001", "nom": ["T-shirt coton bio"], "prix": ["24.90"], "stock": ["142"] },
      { "sku": "MUG-014", "nom": ["Mug émaillé"], "prix": ["14.50"], "stock": ["0"] }
    ]
  }
}

Tout est encore dans un seul item n8n. Un node Split Out sur le champ catalogue.produit transforme le tableau en un item par produit — c'est le pivot de tout traitement de liste, détaillé dans notre guide Split Out et Aggregate. Ensuite : un Filter écarte les ruptures ({{ Number($json.stock[0]) > 0 }}), un Edit Fields aplatit et convertit les types ({{ Number($json.prix[0]) }}), et un node Google Sheets en mode « Append or Update » avec sku comme clé synchronise l'onglet — le montage Sheets complet est dans notre guide Google Sheets.

Namespaces et SOAP : parser une enveloppe

Les réponses SOAP arrivent préfixées :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetStockResponse><quantite>142</quantite></GetStockResponse>
  </soap:Body>
</soap:Envelope>

Le node XML les convertit sans broncher, mais les deux-points dans les clés (soap:Envelope) interdisent la notation pointée. Utilisez la notation entre crochets : {{ $json['soap:Envelope']['soap:Body'][0]['GetStockResponse'][0].quantite[0] }}. Le node n'expose pas d'option pour retirer les préfixes ; si l'enchaînement de crochets devient illisible, un node Code de trois lignes peut renommer les clés après conversion. Pour l'appel lui-même : un HTTP Request en POST, l'enveloppe XML dans le body, Content-Type: text/xml et l'en-tête SOAPAction exigé par le service.

Le mode inverse : JSON to XML

Le même node génère du XML depuis vos items : Mode JSON to XML, et les options changent — Root Name (le nom de l'élément racine), Headless (omettre ou non le prolog <?xml ... ?>), Cdata (encapsuler les textes à caractères spéciaux dans <![CDATA[ ... ]]> plutôt que de les échapper). C'est la brique pour poster vers une API legacy qui n'accepte que du XML, générer un sitemap, ou produire un flux à destination d'un partenaire — le pendant XML de la génération de fichiers CSV ou Excel.

Les pièges restants

  • Encodage : un flux déclaré ISO-8859-1 dans son prolog peut ressortir avec des accents cassés. Vérifiez le charset réel de la réponse HTTP et, au besoin, faites transiter la réponse en binaire puis extrayez le texte en précisant l'encodage.
  • CDATA : en lecture, le contenu des sections <![CDATA[ ... ]]> ressort comme texte normal — rien à faire. C'est en génération qu'il faut penser à l'option Cdata si vos valeurs contiennent <, & ou du HTML.
  • Gros fichiers : le node XML charge la string entière en mémoire. Un catalogue de plusieurs dizaines de Mo se récupère en binary data et se traite par morceaux — réflexes détaillés dans notre guide des fichiers volumineux dans n8n.

En résumé

Le node XML de n8n fait les deux trajets : XML to JSON pour parser (la donnée doit être une string dans le champ désigné par Property Name, typiquement via HTTP Request en Response Format Text), JSON to XML pour générer. Activez Explicit Array dès le premier test — c'est l'assurance anti-casse la plus rentable du node — et choisissez le sort des attributs avec Merge Attributes ou Attribute Key. Enchaîné avec Split Out, un filtre et Google Sheets, il transforme n'importe quel flux legacy en pipeline propre. Et si votre objectif est justement de rendre exploitables des sources hétérogènes — flux XML, documents, exports — par une IA qui répond aux questions de l'équipe, le Pack Assistant RAG fournit la chaîne d'ingestion et d'interrogation prête à brancher derrière ce type de conversion.

FAQ

Questions fréquentes

Pourquoi le node XML de n8n renvoie-t-il parfois un objet et parfois un tableau pour le même élément ?

C'est le comportement de l'option Explicit Array. Désactivée, un élément présent une seule fois ressort en objet, et le même élément présent plusieurs fois ressort en tableau : votre workflow casse le jour où le flux ne contient qu'un enregistrement. Activez Explicit Array pour que chaque élément enfant soit systématiquement un tableau, puis écrivez vos expressions en conséquence — le parsing devient déterministe.

Comment récupérer du XML avec le node HTTP Request avant de le convertir ?

Dans les options du node HTTP Request, ajoutez l'option Response et réglez Response Format sur Text : le corps XML arrive alors comme chaîne de caractères dans le champ data de l'item. C'est exactement ce qu'attend le node XML : indiquez data comme Property Name en mode XML to JSON. Sans ce réglage, n8n peut tenter d'interpréter la réponse et le node XML ne recevra pas une string valide.

Peut-on appeler une API SOAP avec n8n alors qu'il n'existe pas de node SOAP dédié ?

Oui : une requête SOAP n'est qu'un POST HTTP avec un corps XML (l'enveloppe) et généralement un en-tête SOAPAction et un Content-Type text/xml. Envoyez l'enveloppe avec HTTP Request, récupérez la réponse en Text, puis convertissez-la avec le node XML. Les balises préfixées comme soap:Body s'atteignent ensuite en notation entre crochets dans les expressions, par exemple $json['soap:Envelope']['soap:Body'].

Bundle FlowKit Complet

269 €