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?

    Нисколько. Редактор бесплатный, без рекламы и без регистрации.