簡體   English   中英

如何使用 Go 獲得 XML 中指定的結構?

[英]How to get structure specified in XML with Go?

我有一個像這個測試一樣的 XML 文件test.xml

<metalib tagsetversion="1" name="TLog" version="1">
  <struct name="STRUCT_1">
    <entry name="ENTRY_1"/>
  </struct>

  <struct name="STRUCT_2">
    <entry name="ENTRY_1"/>
    <entry name="ENTRY_2"/>
  </struct>

   <!-- many structs -->

  <union name="UNION" version="1">
    <entry type="STRUCT_1"       id="ID_STRUCT_1" />
    <entry type="STRUCT_2"       id="ID_STRUCT_2" />
  </union>
</metalib>

我想將它解析為 go 結構,如下所示:

map["STRUCT_1"] == ["ENTRY_1"], map["STRUCT_2"] == ["ENTRY_1","ENTRY_2"]

和另一個 map:

map2["ID_STRUCT_1"] == "STRUCT_1", map2["ID_STRUCT_2"] == "STRUCT_2"

我曾嘗試使用github.com/clbanning/mxj/x2j解決這個問題,我的代碼如下:

package main

import (
    "encoding/json"
    "os"
    "fmt"
    "testing"

    "github.com/clbanning/mxj/x2j"
)

func TestXml2Map(t *testing.T) {
    filePath := "test.xml"
    fi, fierr := os.Stat(filePath)
    if fierr != nil {
        fmt.Println("fierr:", fierr.Error())
        return
    }
    fh, fherr := os.Open(filePath)
    if fherr != nil {
        fmt.Println("fherr:", fherr.Error())
        return
    }
    defer fh.Close()
    buf := make([]byte, fi.Size())
    _, nerr := fh.Read(buf)
    if nerr != nil {
        fmt.Println("nerr:", nerr.Error())
        return
    }
    mmap, merr := x2j.XmlToMap(buf)
    if merr != nil {
        fmt.Println("merr:", merr.Error())
        return
    }
    // fmt.Println("mmap:", mmap)
    metalib := mmap["metalib"]
    // fmt.Println("metalib:", metalib)

    json.Unmarshal(buf, &metalib)
    mapmetalib := metalib.(map[string]interface{})
    // fmt.Println("mapmetalib struct: ", mapmetalib["struct"])

    istruct := mapmetalib["struct"]
    json.Unmarshal(buf, &istruct)
    mapstruct := istruct.([]interface{})
    fmt.Println("mapstruct: ", mapstruct)
}

但我很困惑,不知道下一步該怎么做。

package main

import (
    "encoding/xml"
    "fmt"
)

type entry struct {
    Name string `xml:"name,attr"`
}
type Struct struct {
    Name  string  `xml:"name,attr"`
    Entry []entry `xml:"entry"`
}
type metalib struct {
    XMLName xml.Name `xml:"metalib"`
    Struct  []Struct `xml:"struct"`
}

func main() {
    datastr := []byte(`<metalib tagsetversion="1" name="TLog" version="1">
        <struct name="STRUCT_1">
            <entry name="ENTRY_1"/>
        </struct>

        <struct name="STRUCT_2">
            <entry name="ENTRY_1"/>
            <entry name="ENTRY_2"/>
        </struct>

        <!-- many structs -->

        <union name="UNION" version="1">
        <entry type="STRUCT_1"       id="ID_STRUCT_1" />
        <entry type="STRUCT_2"       id="ID_STRUCT_2" />
        </union>
        </metalib>`)
    metalib := metalib{}
    err := xml.Unmarshal(datastr, &metalib)
    if err != nil {
        return
    }
    fmt.Printf("%v\n", metalib)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM