Reputation: 341
I'm trying to read som XML with golang. I'm basing it on this example which works. https://gist.github.com/kwmt/6135123#file-parsetvdb-go
This is my files:
Castle0.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Channel>
<Title>test</Title>
<Description>this is a test</Description>
</Channel>
test.go
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type Query struct {
Chan Channel `xml:"Channel"`
}
type Channel struct {
title string `xml:"Title"`
desc string `xml:"Description"`
}
func (s Channel) String() string {
return fmt.Sprintf("%s - %d", s.title, s.desc)
}
func main() {
xmlFile, err := os.Open("Castle0.xml")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer xmlFile.Close()
b, _ := ioutil.ReadAll(xmlFile)
var q Query
xml.Unmarshal(b, &q)
fmt.Println(q.Chan)
}
Output: - %!d(string=)
Any one know what I'm doing wrong? (I'm doing this to learn go, so go easy on me :P)
Upvotes: 4
Views: 8058
Reputation: 36199
Other packages, including encoding/json
and encoding/xml
can only see exported data. So firstly your title
and desc
should be Title
and Desc
correspondingly.
Secondly, you're using %d
(integer) format in Sprintf
when printing a string. That's why you're getting %!d(string=)
, which means "it's not an integer, it's a string!".
Thirdly, there is no query in your XML, so unmarshal directly into q.Chan
.
This is the working example. http://play.golang.org/p/l0ImL2ID-j
Upvotes: 4