ToolDeck

XML to YAML

XMLをYAML形式に変換

サンプルを試す

XML入力

YAML出力

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

XMLからYAMLへの変換とは?

XMLからYAMLへの変換とは、Extensible Markup Language(XML)のデータをYAML Ain't Markup Language(YAML)に変換するプロセスです。XMLは階層データを角括弧タグと属性で表現しますが、YAMLは同じ構造をインデントとプレーンテキストのキーと値のペアで表現します。XMLからYAMLへのオンライン変換は、Java Spring、Maven、.NETのようなXML中心のシステムから、Kubernetes、Ansible、GitHub Actions、Docker ComposeといったYAMLを採用するプラットフォームへ設定ファイルを移行する際によく行われる作業です。

2つの形式はデータモデルが異なります。XMLはデフォルトですべてを文字列として扱い、型の強制にはスキーマ定義(XSD、DTD)を使用します。YAMLにはネイティブ型があります:文字列、整数、浮動小数点数、真偽値、null、シーケンス(配列)、マッピング(オブジェクト)です。変換時に「true」「5432」「3.14」などの値は、文字列として残るのではなくYAMLのネイティブ型として解釈される場合があります。適切な変換ツールはこれらの値を引用符で囲み、XMLソースの元のテキスト表現を保持します。

XMLにはYAMLに対応する概念がない構造も存在します:属性、名前空間、処理命令、CDATAセクション、コメントなどです。変換では属性の表現方法(一般的には_attrのようなアンダースコアプレフィックス付きキー)について規約を選択し、残りを破棄するかフラット化するかを決める必要があります。変換前にこれらのトレードオフを理解することで、適切なツールを選び、正しく設定し、YAML出力が元のXMLの意図と一致しているかを検証できます。

XML input
<server>
  <host>db.example.com</host>
  <port>5432</port>
  <credentials admin="true">
    <username>deploy</username>
    <password>s3cret</password>
  </credentials>
  <options>
    <option>ssl=true</option>
    <option>timeout=30</option>
  </options>
</server>
YAML output
server:
  host: db.example.com
  port: "5432"
  credentials:
    _admin: "true"
    username: deploy
    password: s3cret
  options:
    option:
      - ssl=true
      - timeout=30

オンラインXMLからYAML変換ツールを使う理由

変換スクリプトを手作業で書くとなると、属性のマッピング、繰り返し要素の配列検出、YAMLの型強制のエッジケースへの対応が必要です。ブラウザベースの変換ツールはこれらすべてを一度に処理し、YAML出力をその場で確認して設定ファイルに直接コピーできます。

即時変換
XMLを貼り付けるとミリ秒でYAML出力が得られます。ライブラリのインストール、ビルド手順、メンテナンスが必要なスクリプトは不要です。
🔒
プライバシー優先の処理
変換処理はすべてJavaScriptを使用してブラウザ内で実行されます。XMLデータはマシン上に留まり、サーバーに送信されることは一切ありません。
🔀
属性と配列に対応
XML属性はプレフィックス付きキーにマッピングされます。繰り返しの兄弟要素は自動的にYAMLシーケンスにグループ化され、リスト構造が保持されます。
📋
アカウント不要
ページを開いてXMLを貼り付け、YAMLの結果をコピーするだけです。サインアップ、APIキー、使用回数制限は一切ありません。

XMLからYAML変換の使用例

フロントエンド開発
レガシービルドツール(Ant、Maven)のXML設定スニペットを、GitHub ActionsやGitLab CIなどYAML設定ファイルを使用するモダンなCIパイプライン向けのYAMLに変換します。
バックエンドエンジニアリング
Spring XMLのBean定義をSpring Bootのapplication.yml形式に移行したり、.NETのapp.configセクションをコンテナデプロイ向けのYAMLに変換したりします。
DevOpsとインフラ
XMLベースのデプロイメント記述子(Tomcatのserver.xml、IISのweb.config)をKubernetesマニフェスト、HelmチャートまたはAnsible Playbookに対応するYAML形式に変換します。
QAとテスト
XMLテストフィクスチャまたはJUnit設定をYAMLに変換し、YAMLデータソースをサポートするテストフレームワーク(YAMLフィクスチャを使用するpytestやRobot Framework)で利用します。
データエンジニアリング
SAPやOracleなどのエンタープライズシステムからのXMLデータエクスポートを、YAMLベースの設定とスキーマを使用するdbtやAirflowなどのETLツールへの取り込み用YAMLに変換します。
学習とドキュメント作成
学生やテクニカルライターがXMLサンプルを貼り付けることで、要素、属性、ネストがYAMLのインデント、シーケンス、マッピングにどのように変換されるかを具体的に確認できます。

XMLからYAMLへのマッピング早見表

XMLとYAMLは異なるデータモデルを持ちます。以下の表は各XML構造がYAMLの等価表現にどのようにマッピングされるかを示しています。属性は一般的にアンダースコアプレフィックス付きキーに変換され、繰り返し要素はYAMLシーケンスになります。コメントや処理命令などYAMLに対応する表現がない構造は変換時に破棄されます。

XML構造XMLの例YAMLの等価表現
Element<name>text</name>name: text
Nested elements<a><b>1</b></a>a:\n b: "1"
Attributes<el attr="v"/>el:\n _attr: v
Text + attributes<el a="1">text</el>el:\n _a: "1"\n _text: text
Repeated elements<r><i>1</i><i>2</i></r>r:\n i:\n - "1"\n - "2"
Empty element<el/>el: ""
CDATA<![CDATA[raw]]>Treated as plain text
Comments<!-- note -->Discarded (no YAML equivalent)
Namespacesxmlns:ns="uri"Prefix preserved or stripped
Boolean-like text<flag>true</flag>flag: "true" (quoted to stay string)

XMLとYAML:データモデルの違い

XMLとYAMLの変換は単純な構文の置き換えではありません。両形式には変換後のデータ表現に影響を与える根本的な構造上の違いがあります。

型システム
XMLはすべての値をテキスト文字列として格納します。YAMLにはネイティブの真偽値、整数、浮動小数点数、nullがあります。変換時に「true」や「3306」などの値は、変換ツールが引用符で囲まない限りYAMLの真偽値または整数として再解釈される場合があります。出力内の型に依存する値は必ず確認してください。
属性とキー
XML要素は子要素やテキストコンテンツと並んで属性を持つことができます。YAMLにはキーと値のマッピングしかありません。属性は通常のキーに変換する必要があり、子要素と区別するために_や@などのプレフィックスが付けられます。
順序と重複
XMLはドキュメントの順序を保持し、同じタグ名の兄弟要素を許可します。YAMLのマッピングは仕様上順序が定義されていませんが(ほとんどのパーサーは挿入順を保持します)、YAML 1.2では重複キーが禁止されています。繰り返しのXML要素はYAMLシーケンスにする必要があります。

コード例

以下はJavaScript、Python、Go、コマンドラインでXMLをYAMLに変換する実用的な例です。各例はネストされた要素、属性、繰り返しの兄弟タグを扱います。

JavaScript (Node.js)
import { parseStringPromise } from 'xml2js'
import YAML from 'yaml'

const xml = `
<config>
  <database host="localhost" port="5432">
    <name>mydb</name>
  </database>
  <features>
    <feature>auth</feature>
    <feature>logging</feature>
  </features>
</config>`

const obj = await parseStringPromise(xml, { explicitArray: false })
console.log(YAML.stringify(obj))
// → config:
// →   database:
// →     $:
// →       host: localhost
// →       port: "5432"
// →     name: mydb
// →   features:
// →     feature:
// →       - auth
// →       - logging
Python
import xmltodict
import yaml

xml = """
<server>
  <host>db.example.com</host>
  <port>5432</port>
  <replicas>
    <replica>node-1</replica>
    <replica>node-2</replica>
  </replicas>
</server>
"""

# Step 1: XML → Python dict
data = xmltodict.parse(xml)

# Step 2: Python dict → YAML
print(yaml.dump(data, default_flow_style=False))
# → server:
# →   host: db.example.com
# →   port: '5432'
# →   replicas:
# →     replica:
# →     - node-1
# →     - node-2

# With the standard library only (no xmltodict)
import xml.etree.ElementTree as ET

def elem_to_dict(elem):
    d = {}
    if elem.attrib:
        d.update({f"_{k}": v for k, v in elem.attrib.items()})
    for child in elem:
        val = elem_to_dict(child)
        if child.tag in d:
            if not isinstance(d[child.tag], list):
                d[child.tag] = [d[child.tag]]
            d[child.tag].append(val)
        else:
            d[child.tag] = val
    if elem.text and elem.text.strip():
        text = elem.text.strip()
        return text if not d else {**d, "_text": text}
    return d

root = ET.fromstring(xml)
print(yaml.dump({root.tag: elem_to_dict(root)}, default_flow_style=False))
CLI (xq + yq)
# xq is part of the yq package (pip install yq)
# It parses XML via xq and outputs JSON, then pipe to yq for YAML

echo '<config><host>localhost</host><port>8080</port></config>' | xq . | yq -y .
# → config:
# →   host: localhost
# →   port: "8080"

# Using xmlstarlet + yq (Go version: https://github.com/mikefarah/yq)
xmlstarlet sel -t -c '/' input.xml | yq -p=xml -o=yaml
# Reads XML from file and outputs YAML directly
Go
package main

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

	"gopkg.in/yaml.v3"
)

type Server struct {
	XMLName xml.Name `xml:"server"`
	Host    string   `xml:"host" yaml:"host"`
	Port    int      `xml:"port" yaml:"port"`
	Options []string `xml:"options>option" yaml:"options"`
}

func main() {
	data := `<server>
		<host>db.example.com</host>
		<port>5432</port>
		<options><option>ssl=true</option><option>timeout=30</option></options>
	</server>`

	var srv Server
	xml.NewDecoder(strings.NewReader(data)).Decode(&srv)

	out, _ := yaml.Marshal(srv)
	fmt.Println(string(out))
	// → host: db.example.com
	// → port: 5432
	// → options:
	// →   - ssl=true
	// →   - timeout=30
}

よくある質問

XMLからYAMLへの変換はロスレスですか?
完全にはロスレスではありません。XML属性、コメント、処理命令、CDATAセクションにはYAMLのネイティブな対応表現がありません。属性はプレフィックス付きキー(_attrまたは@attr)として保持できますが、コメントと処理命令は破棄されます。XMLに逆変換する必要がある場合は、属性と名前空間宣言が変換後も保持されているか確認してください。
XML属性はYAMLでどのように表現されますか?
ほとんどの変換ツールは属性名にアンダースコア(_)または@記号をプレフィックスとして付け、子要素のキーと区別します。例えば、<server port="8080">はserver:\n _port: "8080"になります。具体的なプレフィックスは使用するライブラリやツールによって異なります。
繰り返しのXML要素は変換時にどうなりますか?
同じ親の下に同じ要素タグが複数回現れる場合、変換ツールはそれらをYAMLシーケンス(リスト)にグループ化します。例えば、2つの<item>兄弟要素はitem:\n - value1\n - value2になります。force-arrayモードが有効でない限り、単一の<item>はスカラー値として残ります。
YAMLをXMLに逆変換できますか?
可能ですが、結果は元の変換で属性と型をどのように扱ったかによって異なります。プレフィックス付きキーで属性が保持されていれば、YAMLからXMLへの変換ツールでそれらを再構築できます。ToolDeckには逆方向のYAML to XMLツールもあります。YAMLのネイティブ型(真偽値、数値)はXMLではテキスト文字列になることに注意してください。
YAML出力で一部の値が引用符で囲まれるのはなぜですか?
YAMLにはネイティブ型があります:true/falseは真偽値、数値そのままは整数または浮動小数点数、yes/no/on/offはYAML 1.1でも真偽値として扱われます。XMLに「true」や「3306」などYAMLパーサーに再解釈されてほしくないテキストが含まれている場合、変換ツールはそれらを引用符で囲みます。これは正しい動作であり、エラーではありません。
大きなXMLファイルはどのように処理すればいいですか?
ブラウザベースの変換ツールは数メガバイトまでのファイルでは十分に動作します。より大きなファイル(10MB以上)にはストリーミングアプローチを使用してください:PythonのiterparseやNode.jsのsaxでXMLをパースし、中間オブジェクトをインクリメンタルに構築してからYAMLにシリアライズします。yqなどのツールもドキュメント全体をメモリに読み込まずにコマンドラインから直接XMLをYAMLに変換できます。
XMLからYAMLへの変換とXMLからJSONへの変換の違いは何ですか?
どちらの変換もXML属性や繰り返し要素を異なるデータモデルにマッピングするという同じ課題に直面します。主な違いは出力形式です。JSONは厳格(コメントなし、明示的な型、厳密な構文)ですが、YAMLはJSONのスーパーセットで、人間にやさしい機能が追加されています:コメント、複数行文字列、アンカー、エイリアスなどです。コンシューマーがAPIまたはJavaScriptランタイムの場合はJSONを選択し、コンシューマーが設定ファイルを手動編集する人間の場合はYAMLを選択してください。