6
5
テーマ、知りたいこと
XMLがJSONよりも優れている点は何なのか知りたいです。
利点と思う点
- DTDで制約できる
- 名前空間機能が備わっている
- 階層構造が前提となっている(JSONの場合、children: [] などのkeyが必要)
欠点と思う点
- 閉じタグにもタグ名が必要でデータ量が増える
- 属性が文字列しか扱えず、結局<name></name>で囲むなど冗長
個人的な結論
DTDや名前空間などの機能が備わっているのが大きいポイントで、あとは互換性の問題などがない限り、JSONを選択しない理由はないのではないかと思いましたが、皆さんはどうでしょうか?
背景、状況
ドキュメントを編集できるアプリケーションを作成していて、
- 太字や箇条書きなどが扱える
- アプリ固有の機能も扱える
という要件を満たすドキュメントデータのフォーマットを考えた際、XMLを思い付きました。
XMLを扱ったことがなかったので、HTMLのようにテキストをタグで囲ったりできるのかと思っていたためです。(マークアップ言語と聞いていたので)
しかしXMLについて調べてみると用途はJSONと変わらないように見え、しかもXMLの利点がほとんど見当たらないと思ったので質問してみました。
なお、ドキュメントデータは、アプリケーション内部でしか使わず、人間が読み書きすることはデバッグ以外ではありません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答39件
#1
総合スコア116443
投稿2023/09/07 05:13
> しかしXMLについて調べてみると用途はJSONと変わらないように見え
用途はだいぶ違うと思いますが・・・
XMLの得意分野はなに?ということですかね?
たとえばエクセルのデータはXMLで書かれています。
SVGも基本的にはXMLですね。
XMLは汎用性や拡張性が高いのがメリットだと思います。
#2
総合スコア38339
投稿2023/09/07 05:18
編集2023/09/07 05:21うまくまとまっているページがあったので提示します。
JSON と XML の違いは何ですか?
個人的にはまずは手軽なJSONの採用を検討しますが
そのドキュメントが、図やメタデータを持つ複合的なものだったり階層構造を持つ場合はXMLを採用すると思います。
提示されている背景、状況の場合は、私ならXMLを採用します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア27
投稿2023/09/07 07:03
編集2023/09/07 07:07#2
回答ありがとうございます!
細かく質問して申し訳ないのですが、図やメタデータを持つ複合的なものだったり階層構造を持つ場合、XMLのほうが良いと考えるのは、どういったところからなのでしょうか?
すみません、背景、状況への補足なのですが、そのドキュメントデータは、アプリケーション内部でしか使わず、人間が読み書きすることはデバッグ以外ではありません。そのような状況でもXMLが良いとお考えになりますか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア38339
投稿2023/09/07 07:19
編集2023/09/07 07:24#4
たとえば複合文書として図を含めたい場合、その図のフォーマットとしてGraphMLを採用すれば、それをそのまま内包できます。
つまり他のアリモノのXMLで表現されたフォーマットをそのまま利用できる、汎用性、再利用性が高いことがメリットとして挙げられるかと思います。
また、XMLはその仕様に階層構造という性質?が最初から組み込まれているので、その文書が階層構造を持つ場合は、XMLを採用するのが自然だと思います。
ドキュメントデータがそのアプリでしか使われない場合でもXMLのほうがよいと思う場合があります。
たとえば「太字や箇条書きなどが扱える」ようにするために、HTMLの簡易版(サブセット)としてフォーマットを定めると楽だと思いますが、その場合はXMLのほうが自然、適切だと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア27
投稿2023/09/07 10:56
編集2023/09/07 11:27#7
なるほど確かにXMLはマークアップ言語であるのに対して、JSONがデータ記述言語である以上、ドキュメントデータのフォーマットはXMLを選択するというのが自然という気がしてきました。
XMLの方が良いという考えに納得できそうです。
とはいえ、私としては明確な理由がないと完全な納得はし難いですね。
人間がドキュメントデータを管理するなら、JSONよりもXMLが良いというのには完全に納得です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#10
総合スコア65
投稿2023/09/12 02:35
編集2023/09/12 05:17どちらも、構造化されたテキストデータの交換のためのフォーマットで、単体でみると、技術的には大きな差は無いように思います。
しかし、現実的に、それらのフォーマットで表現されたデータを取り扱うプログラマとして私は、その時に使うプログラミング言語やそのエコシステムにどの程度浸透しているか、オブジェクトマッピングする時の親和性が高いか、サポートするライブラリ/パッケージの有無、などを重視します。
特に、オブジェクトマッピングする時の親和性については、xmlには、ドキュメント中にタグという形で、データ要素の「型」を表現できるため、オブジェクトの型がカッチリと決まったJavaのような言語と親和性が高いのが特徴です。
jsonは、JavaScriptは勿論、pythonなど型が緩い言語と親和性が高いです。
逆の組合せをやらないといけないときは、個人の感想で恐縮ですが「うぇ」ってなります。
追記:
ドキュメントを保存するためのフォーマットとして、という観点から明確にお答えすると、プログラミング言語も選べるのなら、静的型付け言語でXML採用します。
ある程度リッチなドキュメントであれば、テキストとタグ(オブジェクト)を混ぜたデータを取り扱う必要がありそうですが、それはXMLのほうが得意です。(HTMLはそのためにデザインされていて、ほぼ同じ構造なので)
jsonでおなじことをやろうとすると、配列のなかに、文字列とオブジェクトを並べて書いていって、オブジェクトには必ず型名のようなものも記載しないといけなくなって(プログラムで処理するにしても)ちょっと煩雑かな、と思いました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#12
総合スコア27
投稿2023/09/12 03:10
編集2023/09/12 05:33#10
個人的に、どちらも表現力は同等であり、人間が階層的なデータを管理するような状況ではXMLで、それ以外はJSONという考えに落ち着いていたところでした。
XMLは、型にカッチリした言語では、タグを型として扱うことでオブジェクトマッピング時に親和性がある。という観点があるのですね。勉強になります。
少し思ったのは、例えばJSONでも以下のように表現することで、型を表現できるのではないかと思ったのですが、その点はどうでしょうか?
json
1{"type": "data", "meta": {}, "children": []}
追記への返信:
今考えてみると、確かに上記の方法は煩雑ですね。ドキュメントデータを扱うなら基本はXMLがベターかもしれません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#14
総合スコア27
投稿2023/09/12 03:46
編集2023/09/12 03:53#13
なるほど。XML運用の経験がないというのもあり、XMLに拡張性、汎用性がある。というのにいまいちピンとこないんですよね。#5のようにGraphML, HTMLなどの既存の言語の記法を活用できるという点のことでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#16
総合スコア38339
投稿2023/09/12 04:32
編集2023/09/12 04:40XMLの利点として、データ変換についての仕様も定められていることが挙げられます。
たとえば単純な文書を示す<Doc>This is a pen.</Doc>
というXMLデータがあったとします。
いまこれに用紙サイズ(デフォルト値はA4)という新たな情報を追加して
<Doc><Paper>A4</Paper>This is a pen.</Doc>
というデータに変換(バージョンアップ)したい場合、以下のようなXSLTスタイルシートを使えばよいです。(ChatGPTが生成したコードであり動作は未確認です)
XML
1<?xml version="1.0" encoding="UTF-8"?> 2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 3 <!-- マッチングテンプレート --> 4 <xsl:template match="Doc"> 5 <xsl:copy> 6 <!-- すでにPaper要素があるかどうかをチェック --> 7 <xsl:if test="not(Paper)"> 8 <!-- Paper要素を追加し、デフォルト値を設定 --> 9 <Paper>A4</Paper> 10 </xsl:if> 11 <!-- 既存の子要素をコピー --> 12 <xsl:copy-of select="node()"/> 13 </xsl:copy> 14 </xsl:template> 15 16 <!-- その他の要素やテキストをコピー --> 17 <xsl:template match="@*|node()"> 18 <xsl:copy> 19 <xsl:apply-templates select="@*|node()"/> 20 </xsl:copy> 21 </xsl:template> 22</xsl:stylesheet>
このような変換はそれに特化したプログラム(コード)を書く必要はなく、XSL変換をサポートする任意のツール、ライブラリで行うことができます。
あとついでに。以下ではXMLの特徴、メリット、事例などについて簡潔にまとまっています。
船舶海洋情報学 05. XMLによるデータの表現
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#19
総合スコア27
投稿2023/09/12 08:04
編集2023/09/12 08:45#18
私も人が直接読み書きして管理するような場合はXMLのような記法が読みやすいと思っています。(フラットな構造な場合はJSONが良いと思いますが)
ただ今回の質問は、XMLの記法が書きづらいとか読みづらいとか、そういう意図の質問ではないです。通信や保存のフォーマットとしてのXMLについての質問です。
XMLやJSONの主な利用が通信や設定ファイルのフォーマットなので、暗にそれを前提にしていましたが、本来、XMLやJSONはデータ記述言語なので、言語としての意見が来るのは自然ですね。質問文の配慮にかけてました。すみません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#20
総合スコア10
投稿2023/09/13 08:23
個人的にはjsonで良いと思っている派です。
保存処理って楽に作ろうとすると、classやhashmapのような情報をダンプとしてシリアライズして保存する感じになるんですよ。
そうすると、一部オブジェクトの型の問題はありますが、そこに注意すればjsonでもxmlでも保存処理はよほどのことが無い限りそのままシリアライズが可能なんです。
この程度のダンプで済む処理であれば、json一択です。
なぜなら、中身を見ないのだから、ファイルの中身が構造化されて綺麗に見れるとかは一切関係ないからです。
逆にライブラリ等で提供されているだけの単純なダンプでは駄目な場合は、XMLが必要になると思われます。
なお、画像ファイル等がある場合は、zipファイル等でまとめて保存するので、
xml上にバイナリデーターとして持つ必要もないです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#22
この回答は、運営により削除されました。
#23
この回答は、運営により削除されました。
#26
総合スコア27
投稿2023/09/14 15:03
編集2023/09/14 15:10#22#23
Thank you for the very clear and coherent explanation and even for presenting specific advantages.
I didn't quite understand your point about "XML checks for errors in complex data more efficiently than JSON" - do you mean because it can be validated with DTDs and XML Schema? If so, JSON has JSON Schema, what are your thoughts on that?
Translated by DeepL
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#27
総合スコア10
投稿2023/09/15 00:16
編集2023/09/15 00:27その通りです。
基本的に、XMLとJSONは違うもので、表現しようとするとXMLでしか表現できないものが多いのも事実です。
ただ、プログラムとして組んだ場合、保存処理が何を保存するかによってそもそも考えがスタートすると思っています。
その場合、画面情報を格納しているクラスをどうファイルに保存して、保存した結果を読み込むかという話になります。
文章の情報をXMLかJSONに保存する事が目的ではなく、文章情報・修飾情報・画像データ等必要に応じて格納しているクラス情報をダンプできるか否かという話になると思います。
逆に文章の情報として見やすくXMLかJSONで保存するという目的がそもそもおかしいと思っています。
保存ができればいいので、極論としてはバイナリでも保存できてればいいものではないですか?
なので、アプリケーションの内容をのちの拡張性やらなんやらで保存どうこう言う場合に、
内容や構造がわかりやすいとかは、意識しないで良いのかなと個人的には思っています。
そういったアプリケーションの開発が前提条件のうえで、
XMLとJSONで優れているところというと・・・ぶっちゃけJSONで良いのかなと。
サイズがそもそも小さくまとまりますし。
(複数ファイルに分ける場合、そもそもzip形式等で圧縮するので、あんまり気にしなくてもいいといえばいいですが。)
追記
なので、質問の内容と背景が別々になっているのもよくないのかなと。
前提条件として、C#でで作るなら、以下のような質問になると思っています。
class情報をシリアライズして保存する場合、XMLとJSONどちらにするべきでしょうか?
又は、独自にシリアライズ処理を実装する方が良いでしょうか?
それぞれの利点を教えてください。
みたいな質問になるんではなかろうかと。
ならあとは単純に容量と手間なのかなと。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#28
総合スコア27
投稿2023/09/15 03:21
編集2023/09/15 03:38#27
返答ありがとうございます!
質問の内容と背景が別々になっているのもよくないのかなと。
その通りだと思います。理解が浅いまま投稿してしまったので、薄々これはまずいなと思いながらも、自分の背景には深く踏み込まず、保存や通信のフォーマットとしてのXMLとJSONの意見交換に徹しようと思っていました。
言い訳として投稿まで経緯を説明すると、まず私はアプリケーション開発が2つ目で、能力不足で、ドキュメントデータはHTMLやMarkdownのように文章データにメタデータを埋め込んで保存した方が良いのではという考えがあったんですよね。
「4文字目から6文字目まで太字」とするより、太字にしたい部分をタグなどで囲んだ方が自然な表現に思えたので。内容や構造がわかりやすいかは気にしてなくて、XMLとJSONなのは単に引き出しの少なさ故です。
そこで「カスタマイズできるXMLが良さそうかも」となりXMLについて調べてみたものの、これならJSONで良くねとなり、この意見交換を投稿しました。
実は結局、この意見交換の途中で、別にHTMLやMarkdownのように保存しないで、文章データと修飾データを分けて保存した方が実装的に楽だし、これがいいじゃん。となっていました。
ですからご指摘の通り、今回のケースではバイナリで保存してもよさそうです。
ちなみに恥ずかしながら、今回の意見交換でデータ効率求めることを考えて、始めてバイナリの概念を理解しました。
XMLとJSONについて技術的な興味なのですが (そもそもこの意見交換の本筋ですが)
XMLとJSONは違うもので、表現しようとするとXMLでしか表現できないものが多いのも事実です
「XMLでしか表現できないもの」というのが、よく分からないんですよね。一応XMLのタグは以下のようなオブジェクトで表現できるので。無駄が多いですが、むしろattributesに文字列しか使えないXMLより柔軟性があるのではと思ってます。
json
1{ 2 "tag": "root", 3 "attributes": {}, 4 "children": [ 5 {"tag": "data", "attributes": {}, "children": []} 6 ] 7}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#29
総合スコア10
投稿2023/09/15 04:04
#28
簡単なところから言うと、データ型等がまずは当てはまります。
よく言われるのが日付型等です。
多くの場合、日付型をJsonで保存する場合等は、シリアライズとデシリアライズ処理をオーバーライドするなりして、
日付型の文字列フォーマットに落とし込んだりします。
また、データ型としてTypeの指定や制限をXMLドキュメントフォーマットとして適用できる点等です。
同じ事はJsonでも、中身にType等を定義して設定する事はできますが、XMLではXMLのドキュメントフォーマットとして指定できます。(独自かデフォルトかという差)
また、XSLTを使用したフォーマット変換等が行えます。
基本となるXMLからXSLT(XMLでかかれたスタイルシート)を使用して別フォーマット(例えばHTML)等への変換を行えます。
(ただここまでいるかといわれると?となりますが)
また、xmlnsを使用した名前空間をつける事により、同じBookという情報を適宜分ける事ができます。
https://learn.microsoft.com/ja-jp/dotnet/standard/data/xml/managing-namespaces-in-an-xml-document
(この辺もここまで使うか?というレベルなのでなんとも・・・できるといえばできますが。)
Jsonだとファイルを分けるような場合でも分けずに書けるのは利点といえば利点?
この辺参考になるのではなかろうかと
https://xtech.nikkei.com/it/article/COLUMN/20060928/249315/
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#30
総合スコア27
投稿2023/09/15 04:23
編集2023/09/15 04:24#29
なるほど。日付型はいつも何も考えずにシリアライズ/デシリアライズしていたので、その点について何も考えてませんでした。
他のツール周りは、あれば役に立つこともありそうですが、その点でXMLを使うかというと微妙なところだなと思ってたところでした。
リンクありがとうございます!読んでみますね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#31
総合スコア38339
投稿2023/09/16 04:22
かなり本題からずれますが、XMLtoJSON ポリシーに従えばXMLとJSONを相互に変換することができます。
JSON側はかなり冗長に(サイズもでかく)なると思いますが、実際にIBM API ConnectというAPIゲートウェイサービス?ではJSON to XML、XML to JSONどちらもサポートしているようです。
またxmltodictというPythonのモジュールもあります。
まあ、そういったものもあるという情報でした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#33
総合スコア15
投稿2023/09/18 15:51
XMLとJSONは、データの表現において異なるアプローチを取っており、それぞれ特定の用途に向いています。XMLにはいくつかの利点があり、一部の場合には適しているかもしれませんが、JSONもその場面において優れた利点を持っています。以下に、XMLがJSONよりも優れている点と欠点、そして個人的な結論を示します。
XMLの利点:
-
DTDで制約できる: XMLは文書型定義(DTD)を使用して文書の構造やデータの整合性を定義できます。これは特にデータ整合性が重要な場合に有用です。
-
名前空間機能が備わっている: XMLは名前空間をサポートしており、異なる文脈やアプリケーション間で要素名の衝突を回避するのに役立ちます。
-
階層構造が前提となっている: XMLは階層構造を持つため、ツリー構造のデータを表現しやすいです。データがネストされている場合、XMLは直感的に理解しやすい場合があります。
XMLの欠点:
-
閉じタグにもタグ名が必要でデータ量が増える: XMLは要素を開始タグと終了タグで囲む必要があり、これによりデータサイズが増加します。特に大量のデータを扱う場合、JSONに比べて冗長になる可能性があります。
-
属性が文字列しか扱えず、結局<name></name>で囲むなど冗長: XMLの属性はテキストとして表現され、複雑なデータを属性に格納するのは難しい場合があり、結果として要素内にさらにネストする必要が生じることがあります。
個人的な結論:
XMLとJSONはそれぞれ異なる用途に向いています。XMLは文書の整合性や名前空間の管理が必要な場合に適しています。一方、JSONはデータのシリアライズと通信に優れており、特にWebアプリケーションやAPIのデータ交換に広く使用されています。あなたの用途において、データの整合性や名前空間管理が必要な場合はXMLを検討する価値があるかもしれません。しかし、人間が読み書きすることがほとんどなく、データのサイズや効率が重要であれば、JSONの方が適している場合もあります。最終的な選択は、具体的な要件と制約に依存するでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#34
総合スコア1685
投稿2023/09/28 02:20
以下のようなXMLはjsonに変換できなくないですか?
xml
1<body> 2 <p> 3 文章の<b>途中</b>に<b>太字</b>を入れる。<br /> 4 あああ 5 </p> 6</body>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#35
総合スコア116443
投稿2023/09/28 03:07
方針さえきめればDOMであればいくらでもjson化は可能でしょう。
jsonをオブジェクトに戻した後にどう解釈させるか決めればだけです
たとえばnodeName、textContent、childNodesをパラメータにこんな感じにするとか
json
1 {"nodeName":"body","childNodes":[{"nodeName":"#text","textContent":"\n"},{"nodeName":"P","childNodes":[{"nodeName":"#text","textContent":"\n 文章の"},{"nodeName":"b","childNodes":[{"nodeName":"#text","textContent":"途中"}]},{"nodeName":"#text","textContent":"に"},{"nodeName":"b","childNodes":[{"nodeName":"#text","textContent":"太字"}]},{"nodeName":"#text","textContent":"を入れる。"},{"nodeName":"br"},{"nodeName":"#text","textContent":"\n あああ\n "}]},{"nodeName":"#text","textContent":"\n"}]}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#36
総合スコア756
投稿2023/09/29 07:56
XMLの機能はJSONを完全に包含すると思います。
XMLはデータの表現をマークアップできますし、属性なども表現できる
JSONはただのデータ構造にしか過ぎません。
このような単純なデータであれば、XMLとJSONではあまり大差は感じられ無いと思いますが、もっと複雑な要素やデータ構造を表現したいときにXMLのほうが表現方法が豊富です。
https://www.w3schools.com/xml/note.xml
エレメントにアトリビュートがつけられる
小さい利点ですが
https://learn.microsoft.com/en-us/dotnet/standard/linq/sample-xml-file-multiple-purchase-orders
よって、JSONからXMLにはコンバートできますが、XMLからJSONにはコンバートできないです。
無理やりはできますが、XML to JSON to XMLにしたときに一致しません。不可逆です。
DTDによる制約がXMLの仕様レベルで定義されている点
JSONの場合はOASとか1レイヤ上での制約を付ける必要がある
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#37
退会済みユーザー
総合スコア0
投稿2023/10/04 12:54
- JSON はシンプル、XML は強力
- JSON はスキーマに対する標準がない
と思います。
古いけど(2019年)以下の記事を読んだ感想です。
A Deep Look at JSON vs. XML, Part 1: The History of Each | Toptal®
https://www.toptal.com/web/json-vs-xml-part-1
A Deeper Look At JSON vs. XML, Part 2: A Comparison | Toptal®
https://www.toptal.com/web/json-vs-xml-part-2
A Deeper Look at JSON vs. XML, Part 3: The Future | Toptal®
https://www.toptal.com/web/json-vs-xml-part-3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#38
この回答は、運営により削除されました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。