XML Editor online

Code

    Export

    My documents

    Click a document to open it. They are stored only in this browser - nothing is uploaded. Clearing the browser's site data removes them, so download the ones you want to keep.

    AI Assistant

    Any AI can write with you - ChatGPT, Claude, Gemini, Copilot.

    1. Click Copy prompt.
    2. Paste it into your AI and say what it should write.
    The AI should

    The document travels in the link after the “#”, which no server sees. What you paste into your AI is handled by its provider.

    Save to your server

    The editor can send each saved version to your own server (a webhook), so your work is kept where you want it. Nothing is sent until you enter an address here.

    What your server receives

    A POST request with JSON (your server must allow CORS from https://xml.giit.ch):

    { "editor": "xml", "event": "save", "id": "…", "name": "Catalog",
      "content": "<?xml version=\"1.0\"?> …",
      "updated": "2026-01-15T09:30:00.000Z" }
    Embed the editor in your website
    <iframe src="https://xml.giit.ch/?embed=1" style="width:100%;height:80vh;border:0"></iframe>
    <script>
    const frame = document.querySelector('iframe');
    addEventListener('message', e => {
      if (e.origin !== 'https://xml.giit.ch' || e.source !== frame.contentWindow) return;
      if (e.data.type === 'xmleditor:ready')
        frame.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog',
          content: '<catalog>…</catalog>' }, 'https://xml.giit.ch');
      if (e.data.type === 'xmleditor:save') saveOnYourServer(e.data.content);
    });
    </script>

    Also possible: ?src=<URL of an XML file> opens a file, &webhook=<URL> saves this document there. The editor can also open in a window of its own (?embed=window), and your page can hand it its own AI prompt and a session key so the AI sends its result to your server (xmleditor:ai, xmleditor:key-request) - see "Use the editor on your own website" below the editor. Details are in llms.txt.

    Help

    How it works

    1. Write XML on the left - or start with New and one of the templates. The tree in the middle shows the elements, attributes, text, comments and CDATA as you type.
    2. Click a node in the tree to go to its place in the code; the cursor in the code shows its node in the tree. Fold elements with the arrow.
    3. Click a name, an attribute value or a text in the tree to edit it right there. Enter or a click elsewhere writes the change into the code (special characters escaped, one step for Undo), Escape cancels. The buttons of a row add a child element or an attribute, move the element up or down, or remove it.
    4. Search marks nodes whose name, value or text contains the words; the XPath field marks the nodes an XPath 1.0 expression selects (_: is the default namespace of the root).
    5. Problems (the first well-formedness error, undeclared namespace prefixes, ids used twice) are listed above the code with line and column - click one to go there.
    6. Node on the right shows the selected node; Insert has ready-made pieces; Convert formats, minifies and turns the document into JSON or YAML.
    7. My documents (the folder button at the top left) lists every document kept in this browser. Export saves XML, minified XML, JSON, YAML or plain text.

    The editor never loads a DTD, a schema or an external entity, and it does not expand entities declared in a DTD: their references stay as written.

    Keyboard shortcuts

    > after a start tag
    Adds the matching end tag
    Ctrl + /
    Comment lines in or out (<!-- -->)
    Ctrl + Enter
    Show the cursor's node in the tree
    Tab / Shift + Tab
    Indent / outdent
    Ctrl + Z / Y
    Undo / redo
    Ctrl + S / E
    Save (download .xml, or to your server) / export
    Ctrl + O
    My documents
    Ctrl + F
    Search in the tree (outside the code)

    Modifier du XML en ligne, avec un arbre en direct

    L’éditeur XML affiche votre code et son arbre des éléments côte à côte. Tout ce que vous tapez apparaît aussitôt dans l’arbre - éléments, attributs, texte, commentaires, CDATA et espaces de noms - et un clic sur n’importe quel nœud vous mène à sa place dans le code. Vous pouvez aussi modifier les noms, les valeurs et le texte directement dans l’arbre, lancer des requêtes XPath et convertir le document en JSON ou YAML.

    Tout fonctionne dans votre navigateur. Les documents ne sont pas envoyés, il n’y a ni inscription ni publicité.

    Ce que l’éditeur sait faire

    Code avec coloration

    Balises, attributs, valeurs, entités, commentaires et CDATA dans leurs propres couleurs, numéros de ligne, balises de fermeture automatiques et une liste claire des problèmes avec ligne et colonne.

    L’arbre des éléments

    Repliez et dépliez les éléments, voyez les attributs, le texte, les commentaires, les instructions de traitement et les espaces de noms, et suivez le chemin du nœud sélectionné.

    Modifier dans l’arbre

    Renommez des éléments et des attributs, modifiez des valeurs et du texte, ajoutez, déplacez et supprimez des éléments - écrits dans le code par petites modifications, avec les caractères spéciaux échappés.

    XPath et recherche

    Un champ XPath 1.0 marque les nœuds correspondants ; la recherche trouve les noms, les valeurs et le texte. Les préfixes d’espace de noms du document fonctionnent en XPath.

    Sûr avec n’importe quel fichier

    Aucune DTD, aucun schéma ni aucune entité externe n’est jamais chargé et aucune entité n’est développée : XXE et les bombes d’entités ne fonctionnent pas.

    Formater et convertir

    Indentez ou minifiez le document, ou transformez-le en JSON ou YAML : les attributs en @name, le texte en #text, les éléments répétés en listes.

    Comment ça marche

    1. Commencer - choisissez un modèle sous « Nouveau », ouvrez un fichier .xml ou collez du code XML.
    2. Modifier - tapez dans le code ou cliquez sur des valeurs dans l’arbre ; les problèmes au-dessus du code indiquent ce qui n’est pas bien formé.
    3. Exporter - enregistrez le XML, une copie minifiée, du JSON, du YAML ou le texte brut.

    Utiliser l’éditeur sur votre propre site web

    Toute page https (et localhost) peut intégrer l’éditeur avec une <iframe> et ?embed=1 - sans inscription, sans clé. Intégré, l’éditeur masque ce texte et affiche un bouton Enregistrer. Il y a deux façons de faire entrer et sortir le document.

    1. Ouvrir un fichier depuis un lien, enregistrer sur votre serveur

    src= ouvre un fichier (votre serveur doit autoriser CORS), webhook= fait envoyer le document à cette adresse par « Enregistrer » (Ctrl+S). Ajoutez &token=… pour un en-tête Authorization: Bearer … et &auto pour enregistrer après chaque modification.

    <iframe src="https://xml.giit.ch/?embed=1&src=https://your-site.com/data/catalog.xml&webhook=https://your-site.com/save.php"
            allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>

    Le webhook reçoit un POST avec du JSON { editor: "xml", event: "save", id, name, content, updated }. Un petit script PHP qui l’enregistre :

    <?php
    header('Access-Control-Allow-Origin: https://xml.giit.ch');
    header('Access-Control-Allow-Headers: Content-Type, Authorization');
    header('Access-Control-Allow-Methods: POST, OPTIONS');
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
    if (($_SERVER['HTTP_AUTHORIZATION'] ?? '') !== 'Bearer SECRET') { http_response_code(403); exit; }
    $d = json_decode(file_get_contents('php://input'), true);
    $name = preg_replace('/[^\w\- ]/u', '_', $d['name']);
    file_put_contents(__DIR__ . "/data/$name.xml", $d['content']);
    echo '{"ok":true}';

    2. Votre page détient le document (postMessage)

    L’éditeur annonce xmleditor:ready, votre page répond par xmleditor:load, l’éditeur signale xmleditor:loaded, xmleditor:change lors de vraies modifications et xmleditor:save quand l’utilisateur enregistre. Votre page peut envoyer xmleditor:get (l’état actuel) ou xmleditor:save (appuyer sur Enregistrer). L’enregistrement passe alors par votre propre connexion et votre propre session.

    <iframe id="ed" src="https://xml.giit.ch/?embed=1" allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
    <script>
    const ed = document.getElementById('ed');
    const ORIGIN = 'https://xml.giit.ch';
    
    addEventListener('message', async e => {
      if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
      const m = e.data;
      if (m.type === 'xmleditor:ready') {               // l’éditeur est prêt : on lui transmet le document
        ed.contentWindow.postMessage({
          type: 'xmleditor:load',
          name: 'Catalog',
          content: await (await fetch('/data/catalog.xml')).text()
        }, ORIGIN);
      }
      if (m.type === 'xmleditor:change') document.title = '● not saved';     // une vraie modification
      if (m.type === 'xmleditor:save') {                // l’utilisateur a cliqué sur "Save"
        await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ name: m.name, content: m.content }) });
        document.title = 'Saved';
      }
    });
    
    // Un bouton d’enregistrement sur votre propre page : la réponse arrive sous forme de xmleditor:save
    function saveNow() { ed.contentWindow.postMessage({ type: 'xmleditor:get' }, ORIGIN); }
    </script>

    L’assistant IA dans votre page : il fonctionne aussi dans le cadre. Avec allow="clipboard-write" sur l’iframe, « Copier le prompt » utilise directement le presse-papiers (sinon l’éditeur se rabat sur l’ancienne commande de copie, ou affiche le prompt à copier à la main). Un lien envoyé par l’IA ne peut pas atteindre un éditeur intégré dans un autre site web : l’éditeur demande donc à l’IA et à l’utilisateur de coller toute la réponse de l’IA dans l’éditeur - ou d’ouvrir l’éditeur dans sa propre fenêtre.

    3. Dans sa propre fenêtre

    window.open("https://xml.giit.ch/?embed=window", "xmleditor-17") ouvre l’éditeur complet dans sa propre fenêtre et échange les mêmes messages avec window.opener. Les liens d’une IA l’y atteignent. xmleditor:load peut aussi transporter context: { host, title, rules } - le prompt de l’IA indique alors où se trouve le document et suit vos règles - et hook: { url, token }, un webhook pour ce seul document, jamais stocké. Fermer la fenêtre avec des modifications non enregistrées envoie xmleditor:closing.

    4. L’IA via votre propre serveur

    Transmettez à l’éditeur votre propre prompt, une adresse sur votre site et une clé pour cette session de l’éditeur. La boîte de dialogue de l’IA affiche alors « Connecté à » votre site, ce que vous indiquez à l’IA, et le choix modifier le document actuel ou en créer un nouveau ; Copier le prompt assemble le tout. L’IA envoie son résultat avec la clé à votre serveur, et votre page l’ouvre dans l’éditeur - un nouveau document s’ouvre séparément et reste dans le navigateur de l’utilisateur. Une clé par session de l’éditeur : elle reste valable tant que l’éditeur est ouvert, et l’éditeur ne la demande avec xmleditor:key-request que tant qu’il n’en a pas. L’éditeur n’envoie jamais la clé lui-même et ne la stocke jamais ; l’adresse doit être en https sur votre propre hôte ou sur un de ses sous-domaines.

    const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // une clé par session de l’éditeur
    const k = await key();
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content, ai: {
      label: 'My Site', prompt: 'Keep the sku attributes. Prices in CHF.',
      endpoint: 'https://your-site.com/api/ai-result.php', key: k.key } }, ORIGIN);
    // retenez l’id de xmleditor:loaded et ignorez change/save/closing portant un autre id
    // seulement tant que l’éditeur n’a pas de clé :
    if (m.type === 'xmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'xmleditor:ai', key: k.key }, ORIGIN); }
    // tant que l’éditeur est ouvert, prévenez votre serveur chaque minute ; fermer l’éditeur ou la page annule la clé
    setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
    // votre serveur a un résultat (polling, SSE …) : target vaut "current" ou "new"
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content: draft, from: 'ai', target }, ORIGIN);

    Créez des clés d’au moins 128 bits aléatoires, ne stockez que leur hash, liez chacune à l’utilisateur connecté, au document et à cette session de l’éditeur, créez-en une par session, ne la gardez valable que tant que votre page signale la session comme ouverte, et annulez-la quand l’éditeur ou la page se ferme.

    Le protocole complet se trouve dans llms.txt - donnez-le à une IA et elle construit la connexion pour votre système. L’éditeur LaTeX et l’éditeur SVG fonctionnent de la même façon avec les préfixes latexeditor: et svgeditor:.

    Questions fréquentes

    Mon XML est-il envoyé sur un serveur ?

    Non. L’éditeur fonctionne entièrement dans votre navigateur. Vos documents ne sont jamais envoyés à un serveur, sauf si vous configurez vous-même un webhook vers votre propre serveur.

    L’éditeur vérifie-t-il mon XML ?

    Oui. Il utilise l’analyseur XML du navigateur et affiche la première erreur de bonne formation avec sa ligne et sa colonne, ainsi que les préfixes d’espace de noms non déclarés et les id utilisés deux fois. Il ne valide pas avec une DTD ni un XML Schema.

    Peut-on ouvrir sans risque du XML avec une DTD ou des entités externes ?

    Oui. L’éditeur ne charge jamais de DTD, de schéma ni d’entité externe et ne développe jamais les entités d’une DTD : les attaques XXE et par expansion d’entités ne fonctionnent pas. Les références à ces entités restent dans le texte telles qu’elles sont écrites.

    Comment utiliser XPath ?

    Tapez une expression XPath 1.0 au-dessus de l’arbre, par exemple //book[price > 30]/title. Les nœuds correspondants sont marqués dans l’arbre ; les flèches passent de l’un à l’autre. Les préfixes déclarés dans le document fonctionnent, et _: désigne l’espace de noms par défaut de l’élément racine.

    Puis-je convertir du XML en JSON ou YAML ?

    Oui. Sous Convertir ou Exporter, le document devient du JSON ou du YAML : les attributs en @name, le texte en #text, les éléments répétés en listes.

    Où mes documents sont-ils enregistrés ?

    Uniquement dans votre navigateur. Cliquez sur le bouton dossier en haut à gauche (Mes documents) pour les ouvrir, renommer, dupliquer, télécharger ou supprimer. Effacer les données de site de votre navigateur les supprime : téléchargez ceux que vous voulez garder - ou laissez l’éditeur les envoyer à votre propre serveur (« Enregistrer sur un serveur »).

    Une IA peut-elle écrire dans l’éditeur XML ?

    Oui, n’importe quelle IA - ChatGPT, Claude, Gemini, Copilot ou l’IA de votre outil de développement. Cliquez sur « Assistant IA », puis sur « Copier le prompt », collez-le dans votre IA et dites-lui ce qu’elle doit écrire. L’IA répond par un lien ; cliquez dessus et le document apparaît dans votre éditeur. « Annuler » revient sur chaque modification.

    Puis-je utiliser l’éditeur sur mon propre site web ?

    Oui. Intégrez-le avec une iframe et échangez les documents par postMessage, ou laissez-le envoyer chaque version enregistrée à votre serveur avec un webhook. Voir Utiliser l’éditeur sur votre propre site web pour des exemples.

    L’éditeur XML est-il payant ?

    Non. L’éditeur est gratuit, sans publicité et sans inscription.