xml - 正确的结构布局以在 go 中解析 xml

标签 xml go struct

尝试使用 golang 解析一些 nmap 数据,但我的结构布局不太有效。链接到 Playground 上的代码:https://play.golang.org/p/kODRGiH71W

package main

import (
    "encoding/xml"
    "fmt"
)

type Extrareasons struct {
    Reason string `xml:"reason,attr"`
    Count  uint32 `xml:"count,attr"`
}

type Extraports struct {
    State  string       `xml:"state,attr"`
    Count  uint32       `xml:"count,attr"`
    Reason Extrareasons `xml:"extrareasons"`
}

type StateProps struct {
    State  string `xml:"state,attr"`
    Reason string `xml:"reason,attr"`
}

type PortProps struct {
    Protocol string `xml:"protocol,attr"`
    Port     uint32 `xml:"portid,attr"`
    StateStuff StateProps `xml:"state"`
}

type PortInfo struct {
    Extra    Extraports `xml:"extraports"`
    PortProp PortProps  `xml:"port"`
}

type Ports struct {
    Port PortInfo `xml:"ports"`
}

func main() {
    xmlString := `<ports>
         <extraports state="closed" count="64">
            <extrareasons reason="conn-refused" count="64" />
         </extraports>
         <port protocol="tcp" portid="22">
            <state state="open" reason="syn-ack" reason_ttl="0" />
            <service name="ssh" method="table" conf="3" />
         </port>
      </ports>`

    var x Ports
    if err := xml.Unmarshal([]byte(xmlString), &x); err == nil {
        fmt.Printf("%+v\n", x)
    } else {
        fmt.Println("err:", err)
    }

}

$ go run test.go 
{Port:{Extra:{State: Count:0 Reason:{Reason: Count:0}} PortProp:{Protocol: Port:0 StateStuff:{State: Reason:}}}}

最佳答案

Ports 所在的图层wrapper struct creates 是不必要的,删除它。您只需要对根 xml 元素的内容建模,即 <ports>其内容由 PortInfo 描述/建模.不需要包装根元素的类型。

简单的改变

var x Ports

var x PortInfo 

它会起作用的。在 Go Playground 上试用.输出(包装):

{Extra:{State:closed Count:64 Reason:{Reason:conn-refused Count:64}}
    PortProp:{Protocol:tcp Port:22 StateStuff:{State:open Reason:syn-ack}}}

关于xml - 正确的结构布局以在 go 中解析 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902518/

相关文章:

python - 如何使用 python 获取 XML 的所有子节点?

reflection - reflect.StructOf 在添加到 633ab74 之前存在什么替代方案?

mongodb - 更改默认的 MongoDB ObjectID 生成器

c++ - 相同结构的内存分配

c - 定义指向结构数组的指针

c++ - 如何在另一个结构中使用一个结构?

java - 如何更改 Java Web 服务客户端中的编码输出

xml - 解析 git 日志输出,最好是 xml

javascript - 处理服务器 XML 响应

url - Golang 提供主页并提供模板页面