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 онлайн із живим деревом

    Редактор XML показує ваш код і його дерево елементів поруч. Усе, що ви вводите, одразу з’являється в дереві - елементи, атрибути, текст, коментарі, CDATA й простори імен, - а клацання будь-якого вузла переносить вас до його місця в коді. Імена, значення й текст можна редагувати й просто в дереві, виконувати запити XPath і перетворювати документ на JSON або YAML.

    Усе працює у вашому браузері. Документи нікуди не вивантажуються, немає ні реєстрації, ні реклами.

    Що вміє редактор

    Код із підсвічуванням

    Теги, атрибути, значення, сутності, коментарі й CDATA власними кольорами, номери рядків, закривальні теги, що додаються самі, і зрозумілий перелік проблем із рядком і стовпцем.

    Дерево елементів

    Згортайте й розгортайте елементи, бачте атрибути, текст, коментарі, інструкції обробки й простори імен і стежте за шляхом вибраного вузла.

    Редагування в дереві

    Перейменовуйте елементи й атрибути, змінюйте значення й текст, додавайте, переміщуйте й видаляйте елементи - усе записується в код невеликими правками, зі спецсимволами в екранованому вигляді.

    XPath і пошук

    Поле XPath 1.0 позначає відповідні вузли; пошук знаходить імена, значення й текст. Префікси просторів імен документа працюють у XPath.

    Безпечно з будь-яким файлом

    Жоден DTD, схема чи зовнішня сутність ніколи не завантажуються, і жодна сутність не розкривається, тож XXE та «бомби сутностей» не працюють.

    Форматування й перетворення

    Додавайте відступи чи стискайте документ або перетворюйте його на JSON чи YAML: атрибути як @name, текст як #text, повторювані елементи як списки.

    Як це працює

    1. Почніть - виберіть шаблон у «Новий», відкрийте файл .xml або вставте код XML.
    2. Редагуйте - пишіть у коді або клацайте значення в дереві; проблеми над кодом підкажуть, що не є коректним XML.
    3. Експортуйте - збережіть XML, стиснуту копію, JSON, YAML або простий текст.

    Редактор на вашому сайті

    Будь-яка сторінка https (і localhost) може вбудувати редактор за допомогою <iframe> і ?embed=1 - без реєстрації, без ключа. У вбудованому вигляді редактор приховує цей текст і показує кнопку «Зберегти». Передати документ у редактор і отримати його назад можна двома способами.

    1. Відкрити файл за посиланням, зберегти на ваш сервер

    src= відкриває файл (ваш сервер має дозволяти CORS), webhook= змушує «Зберегти» (Ctrl+S) надсилати документ на цю адресу. Додайте &token=… для заголовка Authorization: Bearer … і &auto, щоб зберігати після кожної зміни.

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

    Вебхук отримує POST із JSON { editor: "xml", event: "save", id, name, content, updated }. Невеликий PHP-скрипт, який його зберігає:

    <?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. Документ зберігає ваша сторінка (postMessage)

    Редактор повідомляє xmleditor:ready, ваша сторінка відповідає xmleditor:load, редактор повідомляє xmleditor:loaded, xmleditor:change при справжніх змінах і xmleditor:save, коли користувач зберігає. Ваша сторінка може надіслати xmleditor:get (поточний стан) або xmleditor:save (натиснути «Зберегти»). Тоді збереження проходить через ваш власний вхід і сеанс.

    <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') {               // редактор готовий: передайте йому документ
        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';     // справжня зміна
      if (m.type === 'xmleditor:save') {                // користувач натиснув «Зберегти»
        await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ name: m.name, content: m.content }) });
        document.title = 'Saved';
      }
    });
    
    // Кнопка збереження на вашій сторінці: відповідь надходить як xmleditor:save
    function saveNow() { ed.contentWindow.postMessage({ type: 'xmleditor:get' }, ORIGIN); }
    </script>

    ШІ-асистент усередині вашої сторінки: він працює і у фреймі. З allow="clipboard-write" на iframe «Копіювати промпт» використовує буфер обміну напряму (інакше редактор вдається до старої команди копіювання або показує промпт, щоб скопіювати його вручну). Посилання, яке надсилає ШІ, не може дістатися до редактора всередині іншого сайту, тому редактор просить ШІ та користувача натомість вставити всю відповідь ШІ в редактор - або відкрити редактор в окремому вікні.

    3. В окремому вікні

    window.open("https://xml.giit.ch/?embed=window", "xmleditor-17") відкриває повний редактор в окремому вікні, і він обмінюється тими самими повідомленнями з window.opener. Посилання від ШІ доходять до нього туди. xmleditor:load може також містити context: { host, title, rules } - тоді промпт для ШІ каже, де розміщено документ, і дотримується ваших правил - і hook: { url, token }, вебхук лише для цього документа, який ніколи не зберігається. Якщо закрити вікно з незбереженими змінами, надсилається xmleditor:closing.

    4. ШІ через ваш власний сервер

    Передайте редактору власний промпт, адресу на вашому сайті та ключ для цього сеансу редактора. Тоді діалог ШІ показує «Під’єднано до» вашого сайту, що ви повідомляєте ШІ, і вибір змінити поточний документ або створити новий; Копіювати промпт збирає все разом. ШІ надсилає свій результат із ключем на ваш сервер, а ваша сторінка відкриває його в редакторі - новий документ відкривається окремо й залишається в браузері користувача. Один ключ на сеанс редактора: він дійсний, поки редактор відкрито, і лише поки ключа немає, редактор запитує його через xmleditor:key-request. Редактор ніколи сам не надсилає ключ і ніколи його не зберігає; адреса має бути https на вашому власному хості або його піддомені.

    const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // один ключ на сеанс редактора
    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);
    // запам’ятайте id з xmleditor:loaded та ігноруйте change/save/closing з іншим id
    // лише поки редактор не має ключа:
    if (m.type === 'xmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'xmleditor:ai', key: k.key }, ORIGIN); }
    // поки редактор відкрито, повідомляйте свій сервер щохвилини; закриття редактора або сторінки анулює ключ
    setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
    // ваш сервер має результат (polling, SSE …): target - "current" або "new"
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content: draft, from: 'ai', target }, ORIGIN);

    Створюйте ключі щонайменше зі 128 випадкових бітів, зберігайте лише їхній хеш, прив’язуйте кожен до користувача, що увійшов, до документа й до цього сеансу редактора, створюйте один на сеанс, тримайте його дійсним лише поки ваша сторінка повідомляє, що сеанс відкритий, і анулюйте його, коли редактор або сторінка закриваються.

    Увесь протокол - у llms.txt: дайте його ШІ, і він побудує під’єднання для вашої системи. Редактори LaTeX і SVG працюють так само з префіксами latexeditor: і svgeditor:.

    Часті запитання

    Мій XML кудись вивантажується?

    Ні. Редактор повністю працює у вашому браузері. Ваші документи ніколи не надсилаються на сервер, якщо тільки ви самі не налаштуєте вебхук на свій власний сервер.

    Чи перевіряє редактор мій XML?

    Так. Він використовує власний парсер XML браузера й показує першу помилку коректності з рядком і стовпцем, а також неоголошені префікси просторів імен та id, використані двічі. Валідації за DTD чи XML Schema він не виконує.

    Чи безпечно відкривати XML із DTD або зовнішніми сутностями?

    Так. Редактор ніколи не завантажує DTD, схему чи зовнішню сутність і ніколи не розкриває сутності з DTD, тож атаки XXE та розкриття сутностей не працюють. Посилання на такі сутності залишаються в тексті як написано.

    Як користуватися XPath?

    Введіть вираз XPath 1.0 над деревом, наприклад //book[price > 30]/title. Відповідні вузли позначаються в дереві; стрілки переходять від одного до наступного. Префікси, оголошені в документі, працюють, а _: означає простір імен кореневого елемента за замовчуванням.

    Чи можна перетворити XML на JSON або YAML?

    Так. У Конвертер або Експорт документ стає JSON або YAML: атрибути як @name, текст як #text, повторювані елементи як списки.

    Де зберігаються мої документи?

    Лише у вашому браузері. Натисніть кнопку з текою вгорі ліворуч («Мої документи»), щоб відкривати, перейменовувати, дублювати, завантажувати або видаляти їх. Очищення даних сайту в браузері видаляє їх, тому завантажте ті, які хочете зберегти, - або нехай редактор надсилає їх на ваш власний сервер («На сервер»).

    Чи може ШІ писати в редакторі XML?

    Так, будь-який ШІ - ChatGPT, Claude, Gemini, Copilot або ШІ у вашому інструменті для програмування. Натисніть «ШІ-асистент», потім «Копіювати промпт», вставте його у свій ШІ та скажіть, що треба написати. ШІ відповідає посиланням; клацніть його, і документ з’явиться у вашому редакторі. «Скасувати» повертає кожну зміну назад.

    Чи можна використовувати редактор на моєму сайті?

    Так. Вбудуйте його через iframe й обмінюйтеся документами через postMessage або нехай він надсилає кожну збережену версію на ваш сервер через вебхук. Приклади - у розділі Редактор на вашому сайті.

    Чи платний редактор XML?

    Ні. Редактор безкоштовний, без реклами й без реєстрації.