2016-04-27 10 views
1

golangでいくつかのnmapデータを解析しようとしていますが、私の構造体のレイアウトはあまり効果がありません。遊び場上のコードへのリンク:https://play.golang.org/p/kODRGiH71Wgoogleでxmlを解析する構造体の正しいレイアウト

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:}}}} 

答えて

1

Portsラッパーの構造体が作成する層が不要であり、それをドロップします。ルートxml要素のコンテンツは<ports>でモデル化する必要があり、その内容はPortInfoで記述/モデル化されています。ルート要素をラップする型は必要ありません。

単に

var x PortInfo 

var x Ports 

を変更し、それが動作します。 Go Playgroundで試してみてください。出力(ラップ):

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

ありがとう@icza - easy fix :) – linuxfan

関連する問題