I´m currently trying to learn golang by converting an existing project to "go". This involves working with XML data. The documentation about un-marshalling looks good so far, but I need only certain parts of the XML I´ve to process. The already existing project is using xpath and xslt to archive this. Unfortunately "go" doesn´t seem to have this.
The documentation has this as example:
package main
import (
"encoding/xml"
"fmt"
)
func main() {
type Email struct {
Where string `xml:"where,attr"`
Addr string
}
type Address struct {
City, State string
}
type Result struct {
XMLName xml.Name `xml:"Person"`
Name string `xml:"FullName"`
Phone string
Email []Email
Groups []string `xml:"Group>Value"`
Address
}
v := Result{Name: "none", Phone: "none"}
data := `
<Person>
<FullName>Grace R. Emlin</FullName>
<Company>Example Inc.</Company>
<Email where="home">
<Addr>gre@example.com</Addr>
</Email>
<Email where='work'>
<Addr>gre@work.com</Addr>
</Email>
<Group>
<Value>Friends</Value>
<Value>Squash</Value>
</Group>
<City>Hanga Roa</City>
<State>Easter Island</State>
</Person>
`
err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Printf("XMLName: %#v
", v.XMLName)
fmt.Printf("Name: %q
", v.Name)
fmt.Printf("Phone: %q
", v.Phone)
fmt.Printf("Email: %v
", v.Email)
fmt.Printf("Groups: %v
", v.Groups)
fmt.Printf("Address: %v
", v.Address)
}
How is it possible to filter on an attribute to get only the "home" Email Nodes (and child nodes, if they exist)? Something like
Email []Email `xml:"Email[@where='home']"`