簡単に考えていたのだが、XML表記をそのままJSONへ変換することは出来ない。
簡単に言うと2つ問題がある。
1.XMLから配列への扱い
入力XML(NAMEが1つのとき)
<LIST>
<NAME>あいうえお</NAME>
<NAME>かきくけこ</NAME>
</LIST>
出力JSON(NAMEが1つのとき)
{
"LIST": {
"NAME": "あいうえお"
}
}
入力XML(NAMEが1つ以上とのき)
<LIST>
<NAME>あいうえお</NAME>
<NAME>かきくけこ</NAME>
</LIST>
出力JSON(NAMEが1つ以上のとき)
{
"LIST": {
"NAME": [
"あいうえお",
"かきくけこ"
]
}
}
これは非常にわかりやすい
XMLのNAMEが1件なら配列にはならないのだが、
1件以上あれば鍵カッコで囲われて配列になっている。
なので、XMLの特定のタグについては、
強制配列化を行いたいという要望があちこちのXML2JSONで散見されている。
2.アトリビュート有り無し混在
続いて、アトリビュートの扱いだ。
入力(アトリビュート有り無し混在XML)
<LIST>
<NAME ID='1' IMPORTANCE='20'>あいうえお</NAME>
<NAME>かきくけこ</NAME>
</LIST>
出力JSON(アトリビュート有り無し部のアクセスの仕方が違ってしまう
{
"LIST": {
"NAME": [
{
"-ID": "1",
"-IMPORTANCE": "20",
"#text": "あいうえお"
},
"かきくけこ"
]
}
}
これ、非常にまずい、あいうえおは#textになってて、かきくけこは普通に配列に入っている。ついでにXMLのアトリビュート名にはハイフンがプレフィックスとしてついている。
しかし、XMLからJSONへの変換の仕方としてはこれが一般的なのだ。
上記1の問題から、タグごとにアトリビュートでFORCEARRAYの設定を付けたら配列になるような仕様にするべきと考える。
上記問題2の結果から同じ階層で同じタグ名で、アトリビュート有り無し混在したXMLはJSONへの変換に用いてはならないことになる。
んで、これら2つの問題を考慮したうえで、
XMLからJSONへの変換をもう一度考えてみたが、
やり方として別にgolangでやる必要なんかなかったのでは?
そもそもXMLなんだから、なんでXSLTしないの?
という事に気が付いた。
んで、今色々と試行錯誤中
1 件のコメント:
> そもそもXMLなんだから、なんでXSLTしないの?
ほんとに疑問… XSLTなら、JSONとのlossless変換が標準functionにあるのに…
https://www.w3.org/TR/xpath-functions-31/#func-xml-to-json
コメントを投稿