2021年7月5日月曜日

XMLからJSONへ

簡単に考えていたのだが、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