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)

    Edite XML online, com árvore ao vivo

    O Editor XML mostra o seu código e a árvore de elementos dele lado a lado. O que você digita aparece na árvore na hora - elementos, atributos, texto, comentários, CDATA e namespaces - e um clique em qualquer nó leva você ao lugar dele no código. Você também pode editar nomes, valores e texto direto na árvore, rodar consultas XPath e converter o documento para JSON ou YAML.

    Tudo roda no seu navegador. Os documentos não são enviados, não há cadastro nem publicidade.

    O que o editor sabe fazer

    Código com realce

    Tags, atributos, valores, entidades, comentários e CDATA em cores próprias, números de linha, tags de fechamento que se fecham sozinhas e uma lista clara dos problemas com linha e coluna.

    A árvore de elementos

    Recolha e expanda elementos, veja atributos, texto, comentários, instruções de processamento e namespaces, e acompanhe o caminho do nó selecionado.

    Edite na árvore

    Renomeie elementos e atributos, altere valores e texto, adicione, mova e remova elementos - gravado no código como pequenas edições, com os caracteres especiais escapados.

    XPath e busca

    Um campo XPath 1.0 marca os nós correspondentes; a busca encontra nomes, valores e texto. Os prefixos de namespace do documento funcionam no XPath.

    Seguro com qualquer arquivo

    Nenhuma DTD, schema ou entidade externa é carregada e nenhuma entidade é expandida, então XXE e bombas de entidades não funcionam.

    Formatar e converter

    Indente ou minifique o documento, ou transforme-o em JSON ou YAML: atributos como @name, texto como #text, elementos repetidos como listas.

    Como funciona

    1. Comece - escolha um modelo em "Novo", abra um arquivo .xml ou cole código XML.
    2. Edite - digite no código ou clique em valores na árvore; os problemas acima do código dizem o que não está bem formado.
    3. Exporte - salve o XML, uma cópia minificada, JSON, YAML ou o texto simples.

    Use o editor no seu próprio site

    Qualquer página https (e localhost) pode incorporar o editor com um <iframe> e ?embed=1 - sem cadastro, sem chave. Incorporado, o editor oculta este texto e mostra um botão Salvar. Há dois jeitos de levar o documento para dentro e para fora.

    1. Abrir um arquivo de um link, salvar no seu servidor

    src= abre um arquivo (seu servidor precisa permitir CORS), webhook= faz "Salvar" (Ctrl+S) enviar o documento para esse endereço. Acrescente &token=… para um cabeçalho Authorization: Bearer … e &auto para salvar após cada alteração.

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

    O webhook recebe um POST com JSON { editor: "xml", event: "save", id, name, content, updated }. Um pequeno script PHP que o guarda:

    <?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. A sua página guarda o documento (postMessage)

    O editor diz xmleditor:ready, a sua página responde com xmleditor:load, o editor informa xmleditor:loaded, xmleditor:change em edições reais e xmleditor:save quando o usuário salva. A sua página pode enviar xmleditor:get (o estado atual) ou xmleditor:save (apertar Salvar). Salvar passa então pelo seu próprio login e sessão.

    <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') {               // o editor está pronto: entregue o documento a ele
        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';     // uma edição real
      if (m.type === 'xmleditor:save') {                // o usuário clicou em "Salvar"
        await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ name: m.name, content: m.content }) });
        document.title = 'Saved';
      }
    });
    
    // Um botão de salvar na sua própria página: a resposta chega como xmleditor:save
    function saveNow() { ed.contentWindow.postMessage({ type: 'xmleditor:get' }, ORIGIN); }
    </script>

    Assistente de IA dentro da sua página: ele também funciona no frame. Com allow="clipboard-write" no iframe, "Copiar prompt" usa a área de transferência diretamente (senão o editor recorre ao antigo comando de copiar, ou mostra o prompt para copiar à mão). Um link enviado pela IA não alcança um editor dentro de outro site, então o editor pede à IA e ao usuário que colem a resposta inteira da IA no editor - ou abram o editor em uma janela própria.

    3. Em uma janela própria

    window.open("https://xml.giit.ch/?embed=window", "xmleditor-17") abre o editor completo em uma janela própria e troca as mesmas mensagens com window.opener. Os links de uma IA chegam até ele ali. xmleditor:load também pode levar context: { host, title, rules } - o prompt da IA então diz a que lugar o documento pertence e segue as suas regras - e hook: { url, token }, um webhook só para este documento que nunca é guardado. Fechar a janela com alterações não salvas envia xmleditor:closing.

    4. IA pelo seu próprio servidor

    Entregue ao editor o seu próprio prompt, um endereço no seu site e uma chave para esta sessão do editor. A janela de IA mostra então "Conectado a" o seu site, o que você diz à IA, e a escolha alterar o documento atual ou criar um novo; Copiar prompt junta tudo. A IA envia o resultado com a chave para o seu servidor, e a sua página o abre no editor - um novo documento abre separado e fica no navegador do usuário. Uma chave por sessão do editor: ela vale enquanto o editor estiver aberto, e só enquanto não tiver nenhuma o editor a pede com xmleditor:key-request. O editor nunca envia a chave por conta própria e nunca a guarda; o endereço precisa ser https no seu próprio host ou em um subdomínio dele.

    const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // uma chave por sessão do editor
    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);
    // guarde o id de xmleditor:loaded e ignore change/save/closing com outro id
    // só enquanto o editor não tiver chave:
    if (m.type === 'xmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'xmleditor:ai', key: k.key }, ORIGIN); }
    // enquanto o editor estiver aberto, avise o seu servidor a cada minuto; fechar o editor ou a página invalida a chave
    setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
    // o seu servidor tem um resultado (polling, SSE …): target é "current" ou "new"
    ed.contentWindow.postMessage({ type: 'xmleditor:load', name: 'Catalog', content: draft, from: 'ai', target }, ORIGIN);

    Crie chaves com pelo menos 128 bits aleatórios, guarde só o hash delas, vincule cada uma ao usuário logado, ao documento e a esta sessão do editor, crie uma por sessão, mantenha-a válida só enquanto a sua página informar que a sessão está aberta, e invalide-a quando o editor ou a página fechar.

    O protocolo completo está em llms.txt - entregue-o a uma IA e ela monta a conexão para o seu sistema. O Editor LaTeX e o Editor SVG funcionam do mesmo jeito com os prefixos latexeditor: e svgeditor:.

    Perguntas frequentes

    Meu XML é enviado para algum lugar?

    Não. O editor roda inteiramente no seu navegador. Seus documentos nunca são enviados a um servidor, a não ser que você mesmo configure um webhook para o seu próprio servidor.

    O editor verifica o meu XML?

    Sim. Ele usa o parser XML do próprio navegador e mostra o primeiro erro de boa formação com linha e coluna, além de prefixos de namespace não declarados e ids usados duas vezes. Ele não valida com uma DTD nem com um XML Schema.

    É seguro abrir XML com DTD ou entidades externas?

    Sim. O editor nunca carrega uma DTD, um schema ou uma entidade externa e nunca expande entidades de uma DTD, então ataques XXE e de expansão de entidades não funcionam. As referências a essas entidades ficam no texto como estão escritas.

    Como uso XPath?

    Digite uma expressão XPath 1.0 acima da árvore, por exemplo //book[price > 30]/title. Os nós correspondentes são marcados na árvore; as setas vão de um para o próximo. Os prefixos declarados no documento funcionam, e _: representa o namespace padrão do elemento raiz.

    Posso converter XML para JSON ou YAML?

    Sim. Em Converter ou Exportar, o documento vira JSON ou YAML: atributos como @name, texto como #text, elementos repetidos como listas.

    Onde meus documentos ficam salvos?

    Só no seu navegador. Clique no botão de pasta no canto superior esquerdo (Meus documentos) para abrir, renomear, duplicar, baixar ou excluir os documentos. Limpar os dados do site no navegador os apaga, então baixe os que você quer manter - ou deixe o editor enviá-los ao seu próprio servidor ("Salvar no servidor").

    Uma IA pode escrever no Editor XML?

    Sim, qualquer IA - ChatGPT, Claude, Gemini, Copilot ou a IA da sua ferramenta de programação. Clique em "Assistente de IA", depois em "Copiar prompt", cole na sua IA e diga o que ela deve escrever. A IA responde com um link; clique nele e o documento aparece no seu editor. "Desfazer" desfaz qualquer alteração.

    Posso usar o editor no meu próprio site?

    Sim. Incorpore-o com um iframe e troque documentos com postMessage, ou deixe-o enviar cada versão salva ao seu servidor com um webhook. Veja exemplos em Use o editor no seu próprio site.

    O Editor XML custa alguma coisa?

    Não. O editor é gratuito, sem anúncios e sem cadastro.