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 bearbeiten, mit Live-Baum

    Der XML-Editor zeigt deinen Code und seinen Elementbaum nebeneinander. Was du tippst, erscheint sofort im Baum - Elemente, Attribute, Text, Kommentare, CDATA und Namensräume - und ein Klick auf einen Knoten bringt dich an seine Stelle im Code. Du kannst Namen, Werte und Text auch direkt im Baum bearbeiten, XPath-Abfragen ausführen und das Dokument in JSON oder YAML umwandeln.

    Alles läuft in deinem Browser. Dokumente werden nicht hochgeladen, es gibt keine Anmeldung und keine Werbung.

    Was der Editor kann

    Code mit Hervorhebung

    Tags, Attribute, Werte, Entitäten, Kommentare und CDATA in eigenen Farben, Zeilennummern, End-Tags, die sich selbst schliessen, und eine klare Liste der Probleme mit Zeile und Spalte.

    Der Elementbaum

    Elemente auf- und zuklappen, Attribute, Text, Kommentare, Verarbeitungsanweisungen und Namensräume sehen und dem Pfad des gewählten Knotens folgen.

    Im Baum bearbeiten

    Elemente und Attribute umbenennen, Werte und Text ändern, Elemente hinzufügen, verschieben und entfernen - als kleine Änderungen in den Code geschrieben, mit maskierten Sonderzeichen.

    XPath und Suche

    Ein XPath-1.0-Feld markiert die passenden Knoten; die Suche findet Namen, Werte und Text. Die Namensraum-Präfixe des Dokuments funktionieren in XPath.

    Sicher mit jeder Datei

    Keine DTD, kein Schema und keine externe Entität wird je geladen und keine Entität wird expandiert, darum funktionieren XXE und Entity-Bomben nicht.

    Formatieren und umwandeln

    Das Dokument einrücken oder verkleinern, oder in JSON oder YAML umwandeln: Attribute als @name, Text als #text, wiederholte Elemente als Listen.

    So funktioniert es

    1. Starten - wähle unter «Neu» eine Vorlage, öffne eine .xml-Datei oder füge XML-Code ein.
    2. Bearbeiten - tippe im Code oder klicke Werte im Baum an; die Probleme über dem Code zeigen dir, was nicht wohlgeformt ist.
    3. Exportieren - speichere das XML, eine verkleinerte Kopie, JSON, YAML oder den reinen Text.

    Den Editor auf deiner eigenen Website nutzen

    Jede https-Seite (und localhost) kann den Editor mit einem <iframe> und ?embed=1 einbetten - ohne Anmeldung, ohne Schlüssel. Eingebettet blendet der Editor diesen Text aus und zeigt einen Speichern-Knopf. Das Dokument kommt auf zwei Arten hinein und wieder heraus.

    1. Eine Datei über einen Link öffnen, auf deinem Server speichern

    src= öffnet eine Datei (dein Server muss CORS erlauben), webhook= lässt «Speichern» (Ctrl+S) das Dokument an diese Adresse senden. Füge &token=… für einen Authorization: Bearer …-Header hinzu und &auto, um nach jeder Änderung zu speichern.

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

    Der Webhook erhält einen POST mit JSON { editor: "xml", event: "save", id, name, content, updated }. Ein kleines PHP-Skript, das ihn speichert:

    <?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. Deine Seite hält das Dokument (postMessage)

    Der Editor meldet xmleditor:ready, deine Seite antwortet mit xmleditor:load, der Editor meldet xmleditor:loaded, xmleditor:change bei echten Änderungen und xmleditor:save, wenn gespeichert wird. Deine Seite kann xmleditor:get (den aktuellen Stand) oder xmleditor:save (Speichern drücken) senden. Gespeichert wird dann über dein eigenes Login und deine eigene Sitzung.

    <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') {               // der Editor ist bereit: ihm das Dokument geben
        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';     // eine echte Änderung
      if (m.type === 'xmleditor:save') {                // es wurde auf "Speichern" geklickt
        await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ name: m.name, content: m.content }) });
        document.title = 'Saved';
      }
    });
    
    // Ein Speichern-Knopf auf deiner eigenen Seite: die Antwort kommt als xmleditor:save
    function saveNow() { ed.contentWindow.postMessage({ type: 'xmleditor:get' }, ORIGIN); }
    </script>

    KI-Assistent in deiner Seite: Er funktioniert auch im Frame. Mit allow="clipboard-write" am iframe nutzt «Prompt kopieren» direkt die Zwischenablage (sonst greift der Editor auf den alten Kopierbefehl zurück oder zeigt den Prompt zum Kopieren von Hand). Ein Link der KI erreicht keinen Editor in einer anderen Website, darum sagt der Editor der KI und dir, die ganze Antwort der KI stattdessen in den Editor einzufügen - oder den Editor in einem eigenen Fenster zu öffnen.

    3. In einem eigenen Fenster

    window.open("https://xml.giit.ch/?embed=window", "xmleditor-17") öffnet den vollen Editor in einem eigenen Fenster, das dieselben Meldungen mit window.opener austauscht. Links einer KI erreichen ihn dort. xmleditor:load kann auch context: { host, title, rules } mitgeben - der KI-Prompt sagt dann, wohin das Dokument gehört, und befolgt deine Regeln - sowie hook: { url, token }, einen Webhook nur für dieses Dokument, der nie gespeichert wird. Wird das Fenster mit ungespeicherten Änderungen geschlossen, kommt xmleditor:closing.

    4. KI über deinen eigenen Server

    Gib dem Editor deinen eigenen Prompt, eine Adresse auf deiner Website und einen Schlüssel für diese Editor-Sitzung. Der KI-Dialog zeigt dann «Verbunden mit» deiner Website, was du der KI sagst, und die Wahl das aktuelle Dokument ändern oder ein neues erstellen; Prompt kopieren setzt alles zusammen. Die KI sendet ihr Ergebnis mit dem Schlüssel an deinen Server, und deine Seite öffnet es im Editor - ein neues Dokument öffnet sich separat und bleibt im Browser der Person, die schreibt. Ein Schlüssel pro Editor-Sitzung: Er bleibt gültig, solange der Editor offen ist, und nur solange er keinen hat, fragt der Editor mit xmleditor:key-request danach. Der Editor sendet den Schlüssel selbst nie und speichert ihn nie; die Adresse muss https auf deinem eigenen Host oder einer Subdomain davon sein.

    const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // ein Schlüssel pro Editor-Sitzung
    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);
    // die id aus xmleditor:loaded merken und change/save/closing mit anderer id ignorieren
    // nur solange der Editor keinen Schlüssel hat:
    if (m.type === 'xmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'xmleditor:ai', key: k.key }, ORIGIN); }
    // solange der Editor offen ist, jede Minute deinem Server melden; Schliessen des Editors oder der Seite macht den Schlüssel ungültig
    setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
    // dein Server hat ein Ergebnis (Polling, SSE …): target ist "current" oder "new"
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content: draft, from: 'ai', target }, ORIGIN);

    Erzeuge Schlüssel mit mindestens 128 Zufallsbits, speichere nur ihren Hash, binde jeden an die angemeldete Person, das Dokument und diese Editor-Sitzung, erzeuge einen pro Sitzung, lass ihn nur gültig, solange deine Seite die Sitzung als offen meldet, und mach ihn ungültig, wenn der Editor oder die Seite schliesst.

    Das ganze Protokoll steht in llms.txt - gib es einer KI, und sie baut die Anbindung für dein System. Der LaTeX-Editor und der SVG-Editor funktionieren gleich, mit den Präfixen latexeditor: und svgeditor:.

    Häufige Fragen

    Wird mein XML hochgeladen?

    Nein. Der Editor läuft ganz in deinem Browser. Deine Dokumente werden nie an einen Server gesendet, ausser du richtest selbst einen Webhook zu deinem eigenen Server ein.

    Prüft der Editor mein XML?

    Ja. Er nutzt den XML-Parser des Browsers und zeigt den ersten Wohlgeformtheitsfehler mit Zeile und Spalte, dazu nicht deklarierte Namensraum-Präfixe und doppelt verwendete ids. Gegen eine DTD oder ein XML Schema validiert er nicht.

    Ist es sicher, XML mit einer DTD oder externen Entitäten zu öffnen?

    Ja. Der Editor lädt nie eine DTD, ein Schema oder eine externe Entität und expandiert nie Entitäten aus einer DTD, darum funktionieren XXE- und Entity-Expansion-Angriffe nicht. Verweise auf solche Entitäten bleiben im Text, wie sie geschrieben sind.

    Wie nutze ich XPath?

    Tippe über dem Baum einen XPath-1.0-Ausdruck ein, zum Beispiel //book[price > 30]/title. Die passenden Knoten werden im Baum markiert; die Pfeile gehen von einem zum nächsten. Im Dokument deklarierte Präfixe funktionieren, und _: steht für den Standard-Namensraum des Wurzelelements.

    Kann ich XML in JSON oder YAML umwandeln?

    Ja. Unter Umwandeln oder Exportieren wird das Dokument zu JSON oder YAML: Attribute als @name, Text als #text, wiederholte Elemente als Listen.

    Wo werden meine Dokumente gespeichert?

    Nur in deinem Browser. Klicke oben links auf den Ordner-Knopf (Meine Dokumente), um sie zu öffnen, umzubenennen, zu duplizieren, herunterzuladen oder zu löschen. Löschst du die Website-Daten deines Browsers, sind sie weg - lade also herunter, was du behalten willst, oder lass den Editor sie an deinen eigenen Server senden («Auf Server speichern»).

    Kann eine KI im XML-Editor schreiben?

    Ja, jede KI - ChatGPT, Claude, Gemini, Copilot oder die KI in deinem Programmier-Tool. Klicke auf «KI-Assistent», dann auf «Prompt kopieren», füge ihn in deine KI ein und sag, was sie schreiben soll. Die KI antwortet mit einem Link; klickst du ihn an, erscheint das Dokument in deinem Editor. «Rückgängig» nimmt jede Änderung zurück.

    Kann ich den Editor auf meiner eigenen Website nutzen?

    Ja. Bette ihn mit einem iframe ein und tausche Dokumente per postMessage aus, oder lass ihn jede gespeicherte Fassung per Webhook an deinen Server senden. Beispiele findest du unter Den Editor auf deiner eigenen Website nutzen.

    Kostet der XML-Editor etwas?

    Nein. Der Editor ist kostenlos, ohne Werbung und ohne Anmeldung.