使用Golang,将XML解析为结构体?

5

我有这样的XML文档,我需要获取一个DATA数组。我已经尝试了4个小时还是无法解决这个简单的任务...只好回到node.js :-)

<?xml version="1.0" standalone="no"?>
<RETS ReplyCode="0" ReplyText="Operation Successful" >
<COUNT Records="58951" />
<DELIMITER value="09"/>
<COLUMNS>   LN  </COLUMNS>
<DATA>  09361303    </DATA>
<DATA>  09333085    </DATA>
<MAXROWS/>

type DATA struct {
    DATA string `xml:"DATA"`
}

type Rets struct {
    DATA []DATA `xml:"RETS>DATA"`
}


data := &Rets{}
decoder := xml.Unmarshal(body,&data)

fmt.Println(decoder)

1
decoderxml.Unmarshal 返回的错误,而你正在将 **Rets 传递给 Unmarshal,而不是 *Rets - JimB
抱歉,当然是 fmt.Println(data),但我得到了一个空对象。 - Svitlana
然而,元素数量是正确的,但它们为空。 - Svitlana
rdata := new(Rets)err = xml.Unmarshal(body, &rdata) fmt.Println(rdata)&{[{} {} {} {} {}] 但是数组元素的数量是正确的 - 可能是因为DATA元素中有空格? - Svitlana
2个回答

9
有一些工具可以将XML转换成Go结构体。其中适合读取的一个是 zek(可以在在线网站上进行测试)。虽然这个工具还处于实验阶段,但已经可以处理一些常见的XML结构。
你可以使用简单命令从XML文件原始文件)生成一个结构体。
$ curl -sL https://git.io/fN4Pq | zek -e -p -c

这将创建一个结构体和一个示例程序,用于测试编组(示例程序很少,它从stdin读取XML并将其转换为JSON)。
这是一个示例结构体(用于从此存储库中获取的一些XML):
// RETS was generated 2018-09-07 12:11:10 by tir on apollo.local.
type RETS struct {
    XMLName       xml.Name `xml:"RETS"`
    Text          string   `xml:",chardata"`
    ReplyCode     string   `xml:"ReplyCode,attr"`
    ReplyText     string   `xml:"ReplyText,attr"`
    METADATATABLE struct {
        Text     string   `xml:",chardata"`
        Resource string   `xml:"Resource,attr"`
        Class    string   `xml:"Class,attr"`
        Version  string   `xml:"Version,attr"`
        Date     string   `xml:"Date,attr"`
        COLUMNS  string   `xml:"COLUMNS"` // MetadataEntryID    SystemNam...
        DATA     []string `xml:"DATA"`    // 7  City        City    Ci ...
    } `xml:"METADATA-TABLE"`
}

免责声明:我编写了zek。


3

来自xml.Unmarshal文档

  • 如果XML元素包含字符数据,则该数据会累积在第一个具有标签“,chardata”的结构字段中。结构字段可以是[]byte或string类型。如果没有这样的字段,则字符数据将被丢弃。

使用方法:

type DATA struct {
    DATA string `xml:",chardata"`
}

type Rets struct {
    DATA []DATA `xml:"DATA"`
}

在这个简单的情况下,您可以直接使用。
type Rets struct {
    DATA []string `xml:"DATA"`
}

默认情况下,它会从一系列元素中收集字符数据。

1
哇,Jim。非常感谢你!我以为我尝试转换到Go语言的第一步失败了:-)! - Svitlana
太好了,两个都可以。我不完全明白chardata是从哪里来的,但我会更多地阅读文档 :-)。祝你有美好的一天! - Svitlana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接