2014-04-17 6 views
10

मैं क्यों इस काम नहीं कर रहाGolang XML विशेषता और मूल्य

type HostProperties struct {                              
      XMLName xml.Name `xml:HostProperties"`                         
      Info []InfoList `xml:"tag"`                           
}                                     
    type InfoList struct {                               
      HostEnd   string `xml:",chardata"`                         
      PatchSummary string `xml:",chardata"`                         
      CPE1   string `xml:",chardata"`                         
      CPE0   string `xml:",chardata"`                         
      SystemType  string `xml:",chardata"`                         
      OperatingSystem string `xml:",chardata"`                         
      MacAddress  string `xml:",chardata"`                         
      Traceroute  string `xml:",chardata"`                         
      IP    string `xml:",chardata"`                         
      FQDN   string `xml:",chardata"`                         
      HostStart  string `xml:",chardata"`                         
    } 
<HostProperties> 
<tag name="HOST_END">Thu Feb 20 12:38:24 2014</tag> 
<tag name="patch-summary-total-cves">4</tag> 
<tag name="cpe-1">cpe:/a:openbsd:openssh:5.6 -&gt; OpenBSD OpenSSH 5.6</tag> 
<tag name="cpe-0">cpe:/o:vmware:esx_server</tag> 
<tag name="system-type">hypervisor</tag> 
<tag name="operating-system">VMware ESXi</tag> 
<tag name="mac-address">00:00:00:00:00:00</tag> 
<tag name="traceroute-hop-0">172.28.28.29</tag> 
<tag name="host-ip">172.28.28.29</tag> 
<tag name="host-fqdn">foobar.com</tag> 
<tag name="HOST_START">Thu Feb 20 12:30:14 2014</tag> 
</HostProperties> 

परिणाम

{HostEnd:172.28.28.29 PatchSummary: CPE1: CPE0: SystemType: OperatingSystem: MacAddress: Traceroute: IP: FQDN: HostStart:} 

इसके साथ ही पहले नए स्लाइस की एक गुच्छा बनाता है यह पता लगाने की नहीं कर पा रहे तत्व भरा हुआ है और फिर भी यह गलत तत्व है। यह अन्य चर भर नहीं रहा है। बाकी की फाइल ठीक से पार्स लगती है, बस इस हिस्से को समझ नहीं सकते।

उत्तर

17

मुझे नहीं लगता कि आप इस तरह एक्सएमएल पार्सिंग काम कर सकते हैं। यहाँ सबसे अच्छा मैं के साथ (run it on the playground)

var data = `<HostProperties> 
<tag name="HOST_END">Thu Feb 20 12:38:24 2014</tag> 
<tag name="patch-summary-total-cves">4</tag> 
<tag name="cpe-1">cpe:/a:openbsd:openssh:5.6 -&gt; OpenBSD OpenSSH 5.6</tag> 
<tag name="cpe-0">cpe:/o:vmware:esx_server</tag> 
<tag name="system-type">hypervisor</tag> 
<tag name="operating-system">VMware ESXi</tag> 
<tag name="mac-address">00:00:00:00:00:00</tag> 
<tag name="traceroute-hop-0">172.28.28.29</tag> 
<tag name="host-ip">172.28.28.29</tag> 
<tag name="host-fqdn">foobar.com</tag> 
<tag name="HOST_START">Thu Feb 20 12:30:14 2014</tag> 
</HostProperties>` 

type HostProperties struct { 
    XMLName xml.Name `xml:HostProperties"` 
    Tags []Tag `xml:"tag"` 
} 

type Tag struct { 
    Key string `xml:"name,attr"` 
    Value string `xml:",chardata"` 
} 

func main() { 
    v := new(HostProperties) 
    err := xml.Unmarshal([]byte(data), v) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 
    fmt.Printf("v = %#v\n", v) 

} 

तुम सच में चाहते हैं कि InfoList संरचना आप Tags के माध्यम से चलाने के लिए और में भरने के लिए होगा ऊपर आ सकता है। मैं शायद सिर्फ एक map[string]string में यह छड़ी होगी हालांकि इस

tags := make(map[string]string) 
for _, tag := range v.Tags { 
    tags[tag.Key] = tag.Value 
} 
fmt.Printf("map = %#v\n", tags) 
+0

ऐसा लगता है कि यह लगभग है, लेकिन यह प्रत्येक मूल्य को अपनी लाइन पर डाल रहा है। मुझे नक्शा [स्ट्रिंग] स्ट्रिंग का विचार पसंद है। मैं इसके बारे में कैसे जाउंगा? या मैं कहां देख सकता हूं। वास्तव में जाने के लिए नया है। '{कुंजी: HOST_END मान: गुरु फरवरी 20 12:38:24 2014}' '{कुंजी: पैच-सारांश-कुल-सीवीएस मूल्य: 4}' – b00stfr3ak

+0

मैंने मानचित्र में डेटा को कैसे रखा जाए इस पर थोड़ा सा जोड़ा [खेल का मैदान] (http://play.golang.org/p/nAeoGIbB7R) –

+0

धन्यवाद यह काम किया। मुझे फिर से विचार करना होगा कि मैं पूरी फाइल कैसे करूँगा। मिलान करने वाले ब्लॉक में डेटा प्राप्त करने के लिए फ़ाइल को स्ट्रीम करना पड़ सकता है। – b00stfr3ak

3

टैग xml:",chardata" वर्तमान तत्व के चरित्र डेटा का चयन करेगा, जैसा कि आप चाहते हैं, लेकिन केवल उस टैग के साथ पहले फ़ील्ड के लिए। यही कारण है कि आपको मिलने वाले परिणाम मिल गए।

दिया एक्सएमएल के लिए, मैं निम्नलिखित प्रकारों में डिकोडिंग सुझाव है:

type HostProperties struct { 
    XMLName xml.Name `xml:"HostProperties"` 
    Info []Tag `xml:"tag"` 
} 

type Tag struct { 
    Name string `xml:"name,attr"` 
    Value string `xml:",chardata"` 
} 

यह स्वचालित रूप से अलग क्षेत्रों में विभिन्न नामित टैग आप के लिए हालांकि विभाजित नहीं होगा: आपको लगता है कि प्रसंस्करण के बाद करने की आवश्यकता होगी एक्सएमएल