ToolDeck

XMLミニファイアー

空白とコメントを削除してXMLを圧縮

サンプルを試す

XML入力

圧縮されたXML

ローカルで実行 · シークレットの貼り付けも安全
圧縮されたXMLはここに表示されます…

XMLミニファイとは?

XMLミニファイとは、XMLドキュメントの意味を変えずに不要な文字をすべて削除するプロセスです。XMLミニファイアーはタグ間の空白を取り除き、コメントを削除し、改行をなくし、インデントを圧縮して、コンパクトな1行出力を生成します。結果として得られるXML文字列は、元のフォーマット済みバージョンとまったく同じようにパーサーに読み込まれ、同一のデータモデルを生成します。

XML 1.0仕様(W3C勧告、第5版)はセクション2.10で空白の扱いに関するルールを定義しています。意味的な値を持たないタグ間の空白は「意味のない空白」と呼ばれます。XMLプロセッサーはこれを破棄することが許可されています。ただし、テキストコンテンツ内の空白は、親要素がxml:space="default"を宣言しない限り、デフォルトでは意味を持ちます。正しいXMLミニファイアーはこの2つのケースを区別し、安全に削除できるものだけを削除します。

ミニファイは圧縮(gzip、Brotli)とは異なります。圧縮はトランスポート層でサイズを削減し、解析前に展開が必要です。ミニファイはドキュメント自体の生のサイズを削減するため、XMLは展開不要で任意のパーサーで有効かつ読み取り可能なまま保たれます。実際には、ミニファイ後に圧縮すると最良の結果が得られます。まず冗長な文字を排除し、次に圧縮アルゴリズムがよりコンパクトな入力に対して動作します。

Before · xml
After · xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Product catalog for Q1 2026 -->
<catalog>
  <product id="p101">
    <name>Widget A</name>
    <price currency="USD">29.99</price>
    <!-- Temporarily discounted -->
    <stock>142</stock>
  </product>
  <product id="p102">
    <name>Widget B</name>
    <price currency="EUR">19.50</price>
    <stock>87</stock>
  </product>
</catalog>
<?xml version="1.0" encoding="UTF-8"?><catalog><product id="p101"><name>Widget A</name><price currency="USD">29.99</price><stock>142</stock></product><product id="p102"><name>Widget B</name><price currency="EUR">19.50</price><stock>87</stock></product></catalog>

XMLミニファイアーを使う理由

インデントとコメント付きのフォーマット済みXMLは開発やコードレビューに最適です。ストレージ、送信、機械処理においては、その余分なフォーマットはメリットなくバイト数を増やすだけです。XMLミニファイアーがそのギャップを埋めます。

転送サイズを即座に削減
典型的なXML設定ファイルから空白とコメントを取り除くと、サイズを20〜40%削減できます。SOAPペイロードや大規模なフィードでは、30%以上の削減も珍しくなく、帯域幅コストとAPIレスポンス時間を削減します。
🔒
クライアントサイドで実行、アップロード不要
ミニファイアーはブラウザ内でネイティブのDOMParserを使用して動作します。サーバーにデータは送信されません。XMLの内容に関係なく、処理はローカルで行われます。
📦
サインアップもインストールも不要
XMLを貼り付けてミニファイされた出力を取得するだけです。アカウント作成、CLIツールのインストール、依存関係は一切不要です。モダンブラウザを搭載した任意のデバイスで動作します。
🔧
整形式のXMLを幅広くサポート
名前空間、CDATAセクション、処理命令、深くネストされた構造に対応しています。入力が整形式のXMLであれば、ミニファイアーは有効なミニファイ済み出力を生成します。

XMLミニファイアーの使用例

フロントエンド開発
HTMLやCSSに埋め込まれたSVGファイルをミニファイします。SVGマークアップから空白とコメントを削除すると、レンダリングされた画像を変えることなくページ容量を削減できます。小規模なSVGアイコンセットでも数キロバイト削減できることがあります。
バックエンドAPI最適化
SOAPレスポンスとXML-RPCペイロードをクライアントに送信する前に縮小します。ミニファイされたXMLはより高速に解析でき、高スループットのサービスでネットワーク遅延を削減します。トランスポート層でまだ圧縮されていないレスポンスで最大の効果を発揮します。
DevOpsとCI/CDパイプライン
ビルドパイプライン内でXML設定ファイル(pom.xml、web.xml、.csproj)をミニファイし、Dockerイメージやデプロイパッケージのアーティファクトサイズを削減します。イメージが小さくなると、プル時間の短縮とコンテナレジストリのストレージコスト削減につながります。
QAとテスト
比較前にXMLテストフィクスチャをミニファイして正規化します。フォーマットの差異を取り除くことで、空白のみの変更による偽陽性のテスト失敗を防ぎます。正規化されたミニファイ済みフィクスチャはバージョン管理の差分レビューもしやすくなります。
データエンジニアリング
大規模なXMLデータフィード(RSS、Atom、XBRL)をデータベースやメッセージキューに保存する前に圧縮します。ペイロードが小さくなるとストレージコストが削減され、キューのスループットが向上します。大規模では、フィードサイズの20%削減が計算コストとI/Oコストに大きく積み重なります。
XML構造の学習
学習者はXMLをミニファイしてから再フォーマットすることで、パーサーが意味のない空白をどのように無視し、ドキュメント構造が視覚的なフォーマットに依存しない理由を理解できます。この演習により、抽象的な仕様のルールが具体的に観察できるものになります。

XMLミニファイが削除するもの

XMLドキュメントのすべての内容が安全に削除できるわけではありません。この参照表は削除可能なコンテンツの種類と、それを破棄することが常に安全か、ユースケース次第かを示しています。

項目安全性
IndentationSpaces/tabs before tagsAlways safe to remove
Line breaks\n and \r\n between tagsAlways safe to remove
Comments<!-- ... -->Safe unless parsed by app
XML declaration<?xml version="1.0"?>Keep if encoding is non-UTF-8
Processing instructions<?xml-stylesheet ...?>Keep if consumed downstream
Trailing whitespaceSpaces after closing tagsAlways safe to remove
Text node whitespaceSpaces inside text contentRemove only between tags, not within

ミニファイ vs Gzip vs バイナリ形式

ミニファイ、圧縮、バイナリエンコードはそれぞれサイズ問題の異なる層に対処します。ミニファイは出力を有効で人間が読めるXMLとして保持します。圧縮(gzip、Brotli)はさらに縮小しますが、解析前に展開ステップが必要です。バイナリ形式は最も圧縮率が高いですが、接続の両端で互換性のあるエンコーダー/デコーダーが必要です — 組み込みシステムやWSDLを多用するエンタープライズサービスで主に実用的です。

XMLミニファイ
意味のない空白、コメント、改行を削除します。出力は依然として有効なXMLで、任意のパーサーで読み取り可能です。典型的な削減率:20〜40%。展開ステップは不要です。
Gzip / Brotli圧縮
バイトストリームに圧縮アルゴリズムを適用します。ミニファイに加えて典型的な削減率:60〜80%。XMLを解析する前に展開ステップが必要です。Content-Encodingを通じたHTTPの標準的な手法です。
バイナリ形式(EXI、Fast Infoset)
XMLインフォセットをバイナリ表現にエンコードします。典型的な削減率:80〜95%。両端で互換性のあるエンコーダー/デコーダーが必要です。組み込みシステムやWSDLを多用するサービスなど制約のある環境で使用されます。

コード例

XMLをプログラムでミニファイする処理は、どの言語でも同じパターンに従います。ドキュメントをツリーとして解析し、必要に応じてコメントノードを削除してから、インデントなしでシリアライズします。

JavaScript (browser)
// Minify XML by parsing and re-serializing (strips formatting)
const raw = `<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>`

const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')

// Remove comment nodes
const walker = doc.createTreeWalker(doc, NodeFilter.SHOW_COMMENT)
const comments = []
while (walker.nextNode()) comments.push(walker.currentNode)
comments.forEach(c => c.parentNode.removeChild(c))

const minified = new XMLSerializer().serializeToString(doc)
// → "<root><item id=\"1\"><name>Test</name></item></root>"
Python
from lxml import etree

xml = """<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>"""

tree = etree.fromstring(xml.encode())

# Remove comments
for comment in tree.iter(etree.Comment):
    comment.getparent().remove(comment)

# Serialize without pretty-print (minified)
result = etree.tostring(tree, xml_declaration=False).decode()
# → '<root><item id="1"><name>Test</name></item></root>'

# With xml.etree (stdlib, no lxml needed)
import xml.etree.ElementTree as ET
root = ET.fromstring(xml)
ET.indent(root, space='')  # Python 3.9+
print(ET.tostring(root, encoding='unicode'))
Go
package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

func minifyXML(input string) (string, error) {
    decoder := xml.NewDecoder(strings.NewReader(input))
    var out strings.Builder
    encoder := xml.NewEncoder(&out)
    // No indentation = minified output
    for {
        tok, err := decoder.Token()
        if err != nil {
            break
        }
        // Skip comments
        if _, ok := tok.(xml.Comment); ok {
            continue
        }
        // Skip whitespace-only char data
        if cd, ok := tok.(xml.CharData); ok {
            if strings.TrimSpace(string(cd)) == "" {
                continue
            }
        }
        encoder.EncodeToken(tok)
    }
    encoder.Flush()
    return out.String(), nil
}
// minifyXML("<a>\n  <b>1</b>\n</a>") → "<a><b>1</b></a>"
CLI (xmllint)
# Minify XML with xmllint (part of libxml2)
xmllint --noblanks input.xml > minified.xml

# Minify from stdin
echo '<root>
  <item>hello</item>
</root>' | xmllint --noblanks -
# → <?xml version="1.0"?><root><item>hello</item></root>

# Strip comments too (combine with sed or xmlstarlet)
xmlstarlet ed -d '//comment()' input.xml | xmllint --noblanks -

# Check size reduction
echo "Before: $(wc -c < input.xml) bytes"
echo "After:  $(xmllint --noblanks input.xml | wc -c) bytes"

よくある質問

ミニファイされたXMLは依然として有効なXMLですか?
はい。ミニファイは意味のない空白とコメントのみを削除します。結果として得られるドキュメントは元のXMLと同じXML 1.0または1.1仕様に準拠しています。準拠しているパーサーはフォーマット済みバージョンとミニファイ済みバージョンの両方から同一のデータモデルを生成します。
ミニファイ後にXMLはどれくらい小さくなりますか?
削減量は元のフォーマット方法によって異なります。コメントが多い深くインデントされたXMLは一般的に20〜40%縮小します。すでにコンパクトなドキュメントは5〜10%程度の削減に留まる場合があります。入力と出力のバイト数を比較して正確な削減量を確認してください。
ミニファイによってXMLが壊れることはありますか?
ミニファイアーがタグ間の空白(意味のない空白)とコメントのみを削除する場合、ドキュメントのセマンティクスは変わりません。例外はxml:space="preserve"セクションで、テキストノード内の空白が意味を持ちます。正しいミニファイアーはこのディレクティブを尊重し、該当セクションをそのまま残します。
XMLミニファイとXML圧縮の違いは何ですか?
ミニファイはXMLテキスト自体を編集し、データを持たない文字を削除します。圧縮(gzip、Brotli)はバイトストリーム全体を解析前に展開が必要な小さなバイナリ形式にエンコードします。ミニファイと圧縮は互いに補完的です。まずミニファイし、次に転送のために圧縮します。
XMLをデータベースに保存する前にミニファイすべきですか?
大量のXMLデータを扱う場合、保存前にミニファイするとディスク使用量が削減され、読み取りが高速化されます。開発者が手動で編集する設定ファイルやテンプレートの場合は、フォーマット済みバージョンを保存し、ビルド時または転送時にミニファイします。読みやすさとストレージ効率のトレードオフです。監査が行われるXML、バージョン管理で差分を確認するXML、運用チームが手動で更新するXMLはミニファイしないでください — そのような場合にフォーマットを保持することで、ストレージの節約をはるかに上回る時間を節約できます。
xmllintはミニファイをサポートしていますか?
はい。xmllint --noblanks input.xmlを実行すると意味のない空白が削除されます。デフォルトではコメントは削除されません。コメントも削除するには、xmlstarlet ed -d '//comment()'でパイプするか、コメントノードを削除するカスタムXSLTを使用してください。
ミニファイはXML解析パフォーマンスにどう影響しますか?
ミニファイされたXMLはパーサーが処理するバイト数が少なく、空白のみのテキストノードが存在しないため、より高速に解析されます。この差異は大きなドキュメント(1MB以上)やストリーミングパーサーで最も顕著で、余分なノードがトラバーサルのオーバーヘッドを増加させます。