XMLと文書形式に関する世界観です。
XMLは、拡張可能なマークアップ記述言語。HTMLと同様にタグを入れ子にした記法によるフォーマットで、設定ファイルやドキュメントの記述などに使われるほか、AjaxやMozillaのXULなどもXMLを用いて行われている。
以前はHTMLをXML化したXHTMLが新しい技術として注目されていたが、HTML5の登場によってHTML5が完全に時代を塗り替えたため、XHTMLは日蔭に追いやられた感がある。
Javaのクラスライブラリなどでも、XMLに対応していて、Javaでプログラムの設定を行うならXMLを使うのが便利である。Antと呼ばれる、XMLベースのMakeのようなビルドシステムは、Java周辺で良く使われている。JavaとXMLは親和性が高い。
HTMLも参照のこと。
また、最近人気のデータフォーマットとして、JSONがある。JSONはJavaScriptと親和性が高く、最近のAjaxやMongoDBなどにも使われている。
JSONを参照のこと。
伝統的な設定ファイルの書式として、iniファイルがある。iniファイルでは、テキストベースのシンプルなデータ記述を行い、コマンドやデーモンなどのアプリケーションの設定に良く使われている。
また、Windowsではレジストリという独自の設定データベースがある。GNOMEではXMLベースのGconfを長らく使っていたが、XMLでは遅いため、バイナリブロブによるdconfへと置換が始まっている。
Boost.PropertyTreeを用いたiniファイルの読み書きはC++(STL・ライブラリ)も参照のこと。
Gconfは、XMLによるレジストリ風の設定システムとして、長らく有名でした。GNOME 2ではGconfが標準です。
ですが、最近はバイナリブロブベースの新しいシステムであるDconf/Gsettingsに取って代わられました。
Dconfはバイナリ式のデータベース。また、GSettingsはDConfのGLibにおける実装です。
GNOMEアーキテクチャも参照のこと。
CSVは、データの値を「,」(カンマ)によって区切り、行(レコード)を改行によって区切るデータ形式。
単純なデータ形式だが、プログラミングの世界ではよく使われる。その性質から、表計算データやデータベースレコードの書き出しや読み込みに使われることが多い。
MS-ExcelやPython入門(ファイル)も参照のこと。
troffは伝統的なUNIXのドキュメント方式で、UNIXのmanコマンドなどに使われている。
Linuxコマンド(ドキュメント)も参照のこと。
また、設定ファイルの記法としては、githubによるTOMLなどがある。
他に、シリアライズなどさまざまな用途に使われるYAMLなどがある。
これらは、従来のini形式を代替し、シンプルでありながらモダンで高機能であるという特徴がある。
また、MarkdownというHTMLよりも簡単な記述フォーマットも存在する。
MediaWikiであれば、Wikipediaと同様のWiki記法を使うことができ、MediaWikiの機能であるテンプレートなどを使用できる。
ブログであれば、Movable Typeやはてななどのブログ専用記法も人気である。
MarkdownやWiki記法を使うことで、複雑なHTMLを書かなくても書きやすい形式から自動でHTMLへと変換してくれる。同時に、これらの記法でなければ書くことができないような高度な記述を簡単に行える。
その他のドキュメント記述フォーマットとして、古いものではTeX, PostScript, PDF, MS-Office, OpenDocumentなどがある。
TeXやPostScriptやPDFやMS-OfficeやLibreOfficeも参照のこと。
以下はGoogleのAIが書いた、C++による簡易的なXMLパーサー。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
// 属性の型定義
using Attributes = std::map<std::string, std::string>;
// ノード構造体
struct Node {
std::string name;
Attributes attrs;
std::string text;
std::vector<Node> children;
};
// パーサークラス
class SimpleXMLParser {
public:
Node parse(const std::string& xml) {
size_t pos = 0;
return parseNode(xml, pos);
}
private:
Node parseNode(const std::string& xml, size_t& pos) {
Node node;
// <タグ名 属性> を見つける
size_t start = xml.find('<', pos);
size_t end = xml.find('>', start);
std::string tagContent = xml.substr(start + 1, end - start - 1);
pos = end + 1;
// 属性の解析
parseAttributes(tagContent, node);
// 空タグ <tag /> のチェック
if (!tagContent.empty() && tagContent.back() == '/') {
node.name = tagContent.substr(0, tagContent.length() - 1);
return node;
}
node.name = tagContent;
// 子ノードとテキストの解析
while (true) {
size_t nextStart = xml.find('<', pos);
if (nextStart == std::string::npos) break;
// 終了タグのチェック
if (xml.substr(nextStart + 1, node.name.length() + 1) == "/" + node.name) {
pos = xml.find('>', nextStart) + 1;
break;
}
// 子ノードなら再帰
if (xml[nextStart + 1] != '/') {
node.children.push_back(parseNode(xml, pos));
} else {
// 終了タグ(自分ではない)はスキップ
pos = xml.find('>', nextStart) + 1;
}
}
return node;
}
void parseAttributes(std::string& tagContent, Node& node) {
size_t firstSpace = tagContent.find(' ');
if (firstSpace == std::string::npos) return;
node.name = tagContent.substr(0, firstSpace);
std::string attrStr = tagContent.substr(firstSpace + 1);
size_t pos = 0;
while (pos < attrStr.length()) {
size_t eq = attrStr.find('=', pos);
if (eq == std::string::npos) break;
std::string key = attrStr.substr(pos, eq - pos);
// keyの空白を除去
key.erase(0, key.find_first_not_of(" "));
key.erase(key.find_last_not_of(" ") + 1);
size_t startQuote = attrStr.find('"', eq);
size_t endQuote = attrStr.find('"', startQuote + 1);
std::string value = attrStr.substr(startQuote + 1, endQuote - startQuote - 1);
node.attrs[key] = value;
pos = endQuote + 1;
}
}
};
// 解析結果を表示する関数
void printNode(const Node& node, int indent = 0) {
std::string spaces(indent, ' ');
std::cout << spaces << "Node: " << node.name << "\n";
for (auto const& [key, val] : node.attrs) {
std::cout << spaces << " Attr: " << key << " = " << val << "\n";
}
for (const auto& child : node.children) {
printNode(child, indent + 4);
}
}
int main() {
std::string xml =
"<library>"
" <book id=\"1\" genre=\"fantasy\">"
" <title>Harry Potter</title>"
" <author>Rowling</author>"
" </book>"
" <book id=\"2\" genre=\"sci-fi\">"
" <title>Dune</title>"
" </book>"
"</library>";
SimpleXMLParser parser;
Node root = parser.parse(xml);
printNode(root);
return 0;
}
実行結果:
Node: library
Node: book
Attr: genre = fantasy
Attr: id = 1
Node: title
Node: author
Node: book
Attr: genre = sci-fi
Attr: id = 2
Node: title
2026.02.20
XML&GUIを参照のこと。
Ajaxを参照のこと。
Java3E(XML)を参照のこと。
XMLはHTMLとよく似たマークアップ言語。
JSONは最近流行しているシンプルなデータ記述フォーマット。PythonやJavaScriptとも相性がいい。
Ajaxを実現するためにはXMLあるいはJSONを使う。