Pourquoi XML domine encore
Les portails français (SeLoger, Leboncoin) ont historiquement imposé XML comme format d'échange. La majorité des CRM ont donc construit leur export sur cette base, et n'ont jamais migré faute de standard JSON équivalent.
Les variantes principales
| CRM / Format | Encodage | Particularité |
|---|---|---|
| Hektor XML | UTF-8 | Champs personnalisables, ordre non garanti |
| Apimo XML | UTF-8 | Très structuré, multilingue natif |
| Netty XML | UTF-8 | Compact, photos en URL externes |
| Ubiflow | UTF-8 | Format pivot, riche en métadonnées portail |
| Iris / FNAIM | ISO-8859-1 | Encodage legacy, attention aux accents |
Structure typique d'une fiche bien XML
<bien>
<reference>APT-001</reference>
<type>appartement</type>
<transaction>vente</transaction>
<prix devise="EUR">485000</prix>
<surface unite="m2">72.5</surface>
<pieces>3</pieces>
<ville>Paris</ville>
<code_postal>75011</code_postal>
<dpe>C</dpe>
<ges>C</ges>
<photos>
<photo ordre="1">https://crm.example.com/photo/1.jpg</photo>
</photos>
</bien>Pièges classiques
- Encodage ISO-8859-1 non déclaré, qui casse les accents.
- Champs vides exprimés tantôt par balise absente, tantôt par balise vide.
- Prix exprimé en centimes ou en euros selon les CRM.
- DPE en lettre ou en valeur kWh, parfois les deux.
- Photos en HTTP non sécurisé qui posent problème sur les sites HTTPS.
Validation et schémas
Peu de CRM publient un XSD officiel. La validation se fait empiriquement, en collectant des échantillons et en construisant un schéma défensif. Ts-Immo maintient ces schémas en interne pour les 19 connecteurs supportés.
Du XML brut à l'API moderne
Plutôt que de consommer du XML directement dans WordPress (source classique de bugs), il est préférable de passer par une passerelle qui ingère le XML, le normalise, et expose une API JSON propre. C'est l'architecture standard recommandée en 2026.
Bonne pratique
Ne jamais coder un parser XML "à la main" dans WordPress. Les flux changent silencieusement de structure, les bugs apparaissent en production, et le débogage est chronophage. Externalisez le parsing à une passerelle dédiée.