YAMLからXMLコンバーター
YAMLをXML形式に変換
YAML入力
XML出力
YAMLからXMLへの変換とは?
YAMLからXMLへの変換は、YAML(YAML Ain't Markup Language)で記述されたデータをXML(Extensible Markup Language)に変換する処理です。YAMLはインデントと最小限の句読点で構造化データを表現しますが、XMLは明示的な階層を持つ開始タグと終了タグを使用します。XMLを受け取るシステムがYAMLで作成されたデータを扱う必要がある場合、この変換は日常的な作業となります。
YAMLは人間が読みやすいように設計されました。Kubernetes、Ansible、Docker Compose、GitHub Actionsといったツールの設定ファイルはYAMLで書かれており、コンパクトで手動編集が容易です。W3C XML 1.0仕様で定義されたXMLは、数十年にわたってエンタープライズシステム、SOAPウェブサービス、ドキュメント中心のワークフローにおけるデフォルトのデータ交換形式として使われてきました。YAMLで書かれた設定がXMLベースのパイプラインに入力される必要がある場合、変換が必要になります。
YAMLとXMLの対応は一対一ではありません。YAMLは真偽値、整数、浮動小数点数、nullといったデータ型をネイティブにサポートしますが、XMLはスキーマ(XSDまたはDTD)が外部で型を定義しない限り、すべてのコンテンツをテキストとして扱います。YAMLのシーケンス(リスト)にはXMLの直接的な対応表現がなく、繰り返し要素として表現する必要があります。これらの違いを理解しておくことで、出力を予測し予期しない結果を避けることができます。
このYAMLからXMLコンバーターを使う理由
YAMLを手動でXMLに書き直すのは、特に深くネストされた構造では手間がかかりミスが生じやすい作業です。このコンバーターは構造変換を即座に処理します。
YAMLからXML変換の使用例
YAMLからXMLへの型マッピング早見表
YAMLのデータ型はXMLに直接マッピングされません。この表は各YAML構造がXMLの等価表現にどのように変換されるかを示しています。これらの規則を理解することで出力を予測し、予期しない結果のトラブルシューティングに役立ちます。
| YAMLの型 | YAMLの例 | XML出力 |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAMLとXML:フォーマットの違い
YAMLとXMLは同じ問題(構造化データの表現)をトレードオフが異なる方法で解決しています。どちらが優れているとは一概には言えず、データを誰が・何が消費するかによって適切な選択が変わります。
| 機能 | YAML | XML |
|---|---|---|
| 構文 | インデントベース | タグベース(<tag>...</tag>) |
| データ型 | ネイティブ(string、int、bool、null、float) | テキストのみ(スキーマで型を追加) |
| コメント | # インラインコメント | <!-- ブロックコメント --> |
| 属性 | ネイティブサポートなし | あり(<tag attr="val">) |
| 名前空間 | 非サポート | あり(xmlns:prefix) |
| ファイルサイズ | 小さい(終了タグなし) | 大きい(冗長なタグ) |
コード例
各言語・環境でYAMLをXMLにプログラムで変換する方法:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>