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)

    XML online bewerken, met een live boom

    De XML-editor toont je code en de elementenboom naast elkaar. Wat je typt, verschijnt meteen in de boom - elementen, attributen, tekst, commentaar, CDATA en naamruimten - en een klik op een knooppunt brengt je naar de plek in de code. Je kunt ook namen, waarden en tekst direct in de boom bewerken, XPath-query's uitvoeren en het document omzetten naar JSON of YAML.

    Alles draait in je browser. Documenten worden niet geüpload, er is geen registratie en geen reclame.

    Wat de editor kan

    Code met kleuring

    Tags, attributen, waarden, entiteiten, commentaar en CDATA in eigen kleuren, regelnummers, eindtags die vanzelf sluiten en een duidelijke lijst met problemen met regel en kolom.

    De elementenboom

    Elementen in- en uitvouwen, attributen, tekst, commentaar, verwerkingsinstructies en naamruimten zien, en het pad van het geselecteerde knooppunt volgen.

    Bewerken in de boom

    Elementen en attributen hernoemen, waarden en tekst wijzigen, elementen toevoegen, verplaatsen en verwijderen - als kleine bewerkingen in de code geschreven, met speciale tekens ge-escapet.

    XPath en zoeken

    Een XPath 1.0-veld markeert de passende knooppunten; de zoekfunctie vindt namen, waarden en tekst. Naamruimteprefixen van het document werken in XPath.

    Veilig met elk bestand

    Er wordt nooit een DTD, schema of externe entiteit geladen en geen entiteit uitgevouwen, dus XXE en entity bombs werken niet.

    Opmaken en omzetten

    Het document inspringen of minificeren, of omzetten naar JSON of YAML: attributen als @name, tekst als #text, herhaalde elementen als lijsten.

    Hoe het werkt

    1. Beginnen - kies een sjabloon onder "Nieuw", open een .xml-bestand of plak XML-code.
    2. Bewerken - typ in de code of klik op waarden in de boom; de problemen boven de code vertellen je wat niet welgevormd is.
    3. Exporteren - sla de XML, een geminificeerde kopie, JSON, YAML of de platte tekst op.

    De editor op je eigen website gebruiken

    Elke https-pagina (en localhost) kan de editor insluiten met een <iframe> en ?embed=1 - geen registratie, geen sleutel. Ingesloten verbergt de editor deze tekst en toont hij een knop Opslaan. Er zijn twee manieren om het document erin en eruit te krijgen.

    1. Een bestand openen via een link, opslaan op je server

    src= opent een bestand (je server moet CORS toestaan), webhook= zorgt dat "Opslaan" (Ctrl+S) het document naar dat adres stuurt. Voeg &token=… toe voor een header Authorization: Bearer … en &auto om na elke wijziging op te slaan.

    <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>

    De webhook krijgt een POST met JSON { editor: "xml", event: "save", id, name, content, updated }. Een klein PHP-script dat het opslaat:

    <?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. Je pagina beheert het document (postMessage)

    De editor zegt xmleditor:ready, je pagina antwoordt met xmleditor:load, de editor meldt xmleditor:loaded, xmleditor:change bij echte bewerkingen en xmleditor:save wanneer de gebruiker opslaat. Je pagina mag xmleditor:get (de huidige toestand) of xmleditor:save (op Opslaan drukken) sturen. Opslaan loopt dan via je eigen login en sessie.

    <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') {               // de editor is klaar: geef hem het 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';     // een echte bewerking
      if (m.type === 'xmleditor:save') {                // de gebruiker klikte op "Opslaan"
        await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ name: m.name, content: m.content }) });
        document.title = 'Saved';
      }
    });
    
    // Een opslaanknop op je eigen pagina: het antwoord komt als xmleditor:save
    function saveNow() { ed.contentWindow.postMessage({ type: 'xmleditor:get' }, ORIGIN); }
    </script>

    AI-assistent binnen je pagina: die werkt ook in het frame. Met allow="clipboard-write" op het iframe gebruikt "Prompt kopiëren" direct het klembord (anders valt de editor terug op het oude kopieercommando, of toont hij de prompt om met de hand te kopiëren). Een link die de AI stuurt, kan een editor binnen een andere website niet bereiken, dus vraagt de editor de AI en de gebruiker om in plaats daarvan het hele antwoord van de AI in de editor te plakken - of de editor in een eigen venster te openen.

    3. In een eigen venster

    window.open("https://xml.giit.ch/?embed=window", "xmleditor-17") opent de volledige editor in een eigen venster en spreekt dezelfde berichten met window.opener. Links van een AI bereiken hem daar. xmleditor:load kan ook context: { host, title, rules } meegeven - de AI-prompt zegt dan waar het document thuishoort en volgt je regels - en hook: { url, token }, een webhook alleen voor dit document die nooit wordt opgeslagen. Als het venster met niet-opgeslagen wijzigingen wordt gesloten, stuurt het xmleditor:closing.

    4. AI via je eigen server

    Geef de editor je eigen prompt, een adres op je site en een sleutel voor deze editorsessie. Het AI-venster toont dan "Verbonden met" je site, wat je de AI vertelt, en de keuze het huidige document wijzigen of een nieuw maken; Prompt kopiëren zet alles bij elkaar. De AI post het resultaat met de sleutel naar je server, en je pagina opent het in de editor - een nieuw document opent apart en blijft in de browser van de gebruiker. Eén sleutel per editorsessie: hij blijft geldig zolang de editor open is, en alleen zolang de editor er geen heeft, vraagt hij erom met xmleditor:key-request. De editor verstuurt de sleutel nooit zelf en slaat hem nooit op; het adres moet https zijn op je eigen host of een subdomein ervan.

    const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // één sleutel per editorsessie
    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);
    // onthoud de id uit xmleditor:loaded en negeer change/save/closing met een andere id
    // alleen zolang de editor geen sleutel heeft:
    if (m.type === 'xmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'xmleditor:ai', key: k.key }, ORIGIN); }
    // zolang de editor open is, meld het elke minuut aan je server; het sluiten van de editor of de pagina maakt de sleutel ongeldig
    setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
    // je server heeft een resultaat (polling, SSE …): target is "current" of "new"
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content: draft, from: 'ai', target }, ORIGIN);

    Maak sleutels met minstens 128 willekeurige bits, sla alleen hun hash op, koppel elke sleutel aan de ingelogde gebruiker, het document en deze editorsessie, maak er één per sessie, houd hem alleen geldig zolang je pagina de sessie als open meldt, en maak hem ongeldig wanneer de editor of de pagina sluit.

    Het hele protocol staat in llms.txt - geef het aan een AI en die bouwt de koppeling voor je systeem. De LaTeX-editor en de SVG-editor werken op dezelfde manier met de voorvoegsels latexeditor: en svgeditor:.

    Veelgestelde vragen

    Wordt mijn XML geüpload?

    Nee. De editor draait volledig in je browser. Je documenten worden nooit naar een server gestuurd, tenzij je zelf een webhook naar je eigen server instelt.

    Controleert de editor mijn XML?

    Ja. Hij gebruikt de eigen XML-parser van de browser en toont de eerste fout in de welgevormdheid met regel en kolom, plus niet-gedeclareerde naamruimteprefixen en id's die twee keer worden gebruikt. Hij valideert niet aan de hand van een DTD of een XML Schema.

    Is het veilig om XML met een DTD of externe entiteiten te openen?

    Ja. De editor laadt nooit een DTD, een schema of een externe entiteit en vouwt nooit entiteiten uit een DTD uit, dus XXE- en entity-expansion-aanvallen werken niet. Verwijzingen naar zulke entiteiten blijven in de tekst staan zoals ze geschreven zijn.

    Hoe gebruik ik XPath?

    Typ een XPath 1.0-expressie boven de boom, bijvoorbeeld //book[price > 30]/title. De passende knooppunten worden in de boom gemarkeerd; de pijlen gaan van de ene naar de volgende. Prefixen die in het document zijn gedeclareerd, werken, en _: staat voor de standaardnaamruimte van het rootelement.

    Kan ik XML omzetten naar JSON of YAML?

    Ja. Onder Omzetten of Exporteren wordt het document JSON of YAML: attributen als @name, tekst als #text, herhaalde elementen als lijsten.

    Waar worden mijn documenten opgeslagen?

    Alleen in je browser. Klik op de mapknop linksboven (Mijn documenten) om ze te openen, te hernoemen, te dupliceren, te downloaden of te verwijderen. Als je de sitegegevens van je browser wist, verdwijnen ze, dus download de documenten die je wilt bewaren - of laat de editor ze naar je eigen server sturen ("Opslaan op server").

    Kan een AI in de XML-editor schrijven?

    Ja, elke AI - ChatGPT, Claude, Gemini, Copilot of de AI in je programmeertool. Klik op "AI-assistent", dan op "Prompt kopiëren", plak hem in je AI en zeg wat die moet schrijven. De AI antwoordt met een link; klik erop en het document verschijnt in je editor. "Ongedaan maken" draait elke wijziging terug.

    Kan ik de editor op mijn eigen website gebruiken?

    Ja. Sluit hem in met een iframe en wissel documenten uit met postMessage, of laat hem elke opgeslagen versie met een webhook naar je server sturen. Zie De editor op je eigen website gebruiken voor voorbeelden.

    Kost de XML-editor iets?

    Nee. De editor is gratis, zonder reclame en zonder registratie.