2016-04-28 11 views
0

Ich bin ziemlich neu zu GO und ich habe Probleme beim Extrahieren von Attributwerten aus XML-Dokumenten. Der folgende Code erzeugt die folgende Ausgabe:Parsing XML-Attribute mit GO

Anwendungs-ID :: „“ Anwendungsname :: „“

Meine Vermutung ist, dass ich bin etwas fehlt, wenn es darum geht, wie Tagging zu verwenden, und ich würde wirklich zu schätzen wenn jemand mir in die richtige Richtung zeigen könnte.

data:=`<?xml version="1.0" encoding="UTF-8"?> 
    <applist> 
     <app app_id="1234" app_name="abc"/> 
    <app app_id="5678" app_name="def"/> 
    </applist> ` 

type App struct { 
    app_id string `xml:"app_id,attr"` 
    app_name string `xml:"app_name"` 
} 

type AppList struct { 
    XMLName xml.Name `xml:"applist"` 
    Apps []App  `xml:"app"` 
} 

var portfolio AppList 
err := xml.Unmarshal([]byte(data), &portfolio) 
if err != nil { 
    fmt.Printf("error: %v", err) 
    return 
} 
fmt.Printf("application ID:: %q\n", portfolio.Apps[0].app_id) 
fmt.Printf("application name:: %q\n", portfolio.Apps[0].app_name) 

Antwort

4

Um in der Lage zu sein, die Elemente, um aus ihr haben „exportiert“ Felder haben, dass app_id und app_name in der App Struktur Sinn sollte mit einem Großbuchstaben beginnen. Darüber hinaus fehlt Ihrem app_name Feld auch ein ,attr in seinem XML-Feld-Tag. Unten finden Sie ein Beispiel für Ihren Code. Ich habe Kommentare zu den Zeilen hinzugefügt, die einige Änderungen erfordern.

package main 

import (
    "fmt" 
    "encoding/xml" 
) 

func main() { 
    data:=` 
    <?xml version="1.0" encoding="UTF-8"?> 
    <applist> 
     <app app_id="1234" app_name="abc"/> 
     <app app_id="5678" app_name="def"/> 
    </applist> 
    ` 

    type App struct { 
     App_id string `xml:"app_id,attr"` // notice the capitalized field name here 
     App_name string `xml:"app_name,attr"` // notice the capitalized field name here and the `xml:"app_name,attr"` 
    } 

    type AppList struct { 
     XMLName xml.Name `xml:"applist"` 
     Apps []App  `xml:"app"` 
    } 

    var portfolio AppList 
    err := xml.Unmarshal([]byte(data), &portfolio) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 
    fmt.Printf("application ID:: %q\n", portfolio.Apps[0].App_id)  // the corresponding changes here for App 
    fmt.Printf("application name:: %q\n", portfolio.Apps[0].App_name) // the corresponding changes here for App 
} 
+0

Perfekt. Danke für die Hilfe. –