2021年7月7日水曜日

XML2MAPもダメだったわ

 なんでこんなバグがあるんだろうなぁ

package xml2json

import (
    "fmt"
    "log"
    "strings"

    "github.com/sbabiv/xml2map"
)

func xml2json(xmlstr string) {
    decoder := xml2map.NewDecoder(strings.NewReader(xmlstr))
    resulterr := decoder.Decode()

    if err != nil {
        log.Printf("info: err = %v\n", err)
    } else {
        log.Printf("info: result = %v\n", result)
        /*
            2021/07/07 22:48:58 info: result = map[DATA:map[@FORCEARRAY://LIST/ITEM //LIST/ITEM/TAGS @TYPE:JSON LIST:map[ITEM:[map[@id:1 TAGS:map[OTHER:aaaa name:[map[#text:あいうえお @ID:1 @IMPORTANCE:20] map[name:かきくけこ] map[name:さしすせそ]]] TITLE:たいとるなんな UUID:0f164f93-fe33-44d4-8f2a-f94518b7cb51] map[TAGS:map[name:[あああ いいいい ううううう]] TITLE:たいとるなんです UUID:f36ea96f-97a8-438e-8656-ca7365f23df9]]]]]
            あれ、map[name:かきくけこ] map[name:さしすせそ] ここがnameでまとまってないバグじゃん・・・
            ありえねー---
            なんでこんなバグがあるんだー
            これやはり、XMLからgoの仮想ファイルシステム作って考えた方がいいかもしれない・・・
        */
    }

    v := result["DATA"]
    log.Printf("info: result[\"DATA\"] = %v\n", v)
    // DATAのアトリビュートは以下の様に取得できる
    ForceArray := strings.Split(result["DATA"].(map[string]interface{})["@FORCEARRAY"].(string), " ")
    Type := strings.Split(result["DATA"].(map[string]interface{})["@TYPE"].(string), " ")
    log.Println("info: ForceArray[0] = ", ForceArray[0], " ForceArray[1] = ", ForceArray[1], " Type = ", Type)
    // DATAの子ノードはLISTという決まりはないので以下のような取り方はダメ
    //やるとしたらDATAも含めて回さないといけない
    l := result["DATA"].(map[string]interface{})["LIST"]

    fmt.Printf("DATA/LIST: %v\n", l)
}

んで、テスト

package xml2json

import "testing"

func TestXml2JSON(t *testing.T) {
    xmlstr := "<DATA TYPE=\"JSON\" FORCEARRAY=\"//LIST/ITEM //LIST/ITEM/TAGS\">" +
        "<LIST>" +
        "  <ITEM id='1'>" +
        "    <UUID>0f164f93-fe33-44d4-8f2a-f94518b7cb51</UUID>" +
        "    <TITLE>たいとるなんな</TITLE>" +
        "    <TAGS>(:コメントはどうなるの?:)" +
        "      <name ID='1' IMPORTANCE='20'>あいうえお</name>" +
        "      <name>かきくけこ</name>" +
        "      <OTHER>aaaa</OTHER>" +
        "      <name>さしすせそ</name>" +
        "    </TAGS>" +
        "  </ITEM>" +
        "  <ITEM>" +
        "    <UUID>f36ea96f-97a8-438e-8656-ca7365f23df9</UUID>" +
        "    <TITLE>たいとるなんです</TITLE>" +
        "    <TAGS>(:コメントはどうなるの?:)" +
        "      <name>あああ</name>" +
        "      <name>いいいい</name>" +
        "      <name>ううううう</name>" +
        "    </TAGS>" +
        "  </ITEM>" +
        "</LIST>" +
        "</DATA>"

    xml2json(xmlstr)
}


で、ソース中にも書いたけどさ

        /*
            2021/07/07 22:48:58 info: result = map[DATA:map[@FORCEARRAY://LIST/ITEM //LIST/ITEM/TAGS @TYPE:JSON LIST:map[ITEM:[map[@id:1 TAGS:map[OTHER:aaaa name:[map[#text:あいうえお @ID:1 @IMPORTANCE:20] map[name:かきくけこ] map[name:さしすせそ]]] TITLE:たいとるなんな UUID:0f164f93-fe33-44d4-8f2a-f94518b7cb51] map[TAGS:map[name:[あああ いいいい ううううう]] TITLE:たいとるなんです UUID:f36ea96f-97a8-438e-8656-ca7365f23df9]]]]]
            あれ、map[name:かきくけこ] map[name:さしすせそ] ここがnameでまとまってないバグじゃん・・・
            ありえねー---
            なんでこんなバグがあるんだー
            これやはり、XMLからgoの仮想ファイルシステム作って考えた方がいいかもしれない・・・
        */


ここよ、どうなってんだよ?

マップがnameでまとまってねーんだよ

おそらく途中に<OTHER>挟んだからだよな?

なんでnameでまとまらないの?

もうあれだ、、、疲れたわ、、、


0 件のコメント: