Last active
April 26, 2016 17:10
-
-
Save noynaert/3c65abf7e0cff99336a179f57ded51be to your computer and use it in GitHub Desktop.
marshalling and unmarshalling XML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// From https://golang.org/src/encoding/xml/example_test.go | |
// Copyright 2012 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package main | |
import ( | |
"encoding/xml" | |
"fmt" | |
"os" | |
) | |
func main(){ | |
ExampleEncoder() | |
} | |
func ExampleMarshalIndent() { | |
type Address struct { | |
City, State string | |
} | |
type Person struct { | |
XMLName xml.Name `xml:"person"` | |
Id int `xml:"id,attr"` | |
FirstName string `xml:"name>first"` | |
LastName string `xml:"name>last"` | |
Age int `xml:"age"` | |
Height float32 `xml:"height,omitempty"` | |
Married bool | |
Address | |
Comment string `xml:",comment"` | |
} | |
v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} | |
v.Comment = " Need more details. " | |
v.Address = Address{"Hanga Roa", "Easter Island"} | |
output, err := xml.MarshalIndent(v, " ", " ") | |
if err != nil { | |
fmt.Printf("error: %v\n", err) | |
} | |
os.Stdout.Write(output) | |
// Output: | |
// <person id="13"> | |
// <name> | |
// <first>John</first> | |
// <last>Doe</last> | |
// </name> | |
// <age>42</age> | |
// <Married>false</Married> | |
// <City>Hanga Roa</City> | |
// <State>Easter Island</State> | |
// <!-- Need more details. --> | |
// </person> | |
} | |
func ExampleEncoder() { | |
type Address struct { | |
City, State string | |
} | |
type Person struct { | |
XMLName xml.Name `xml:"person"` | |
Id int `xml:"id,attr"` | |
FirstName string `xml:"name>first"` | |
LastName string `xml:"name>last"` | |
Age int `xml:"age"` | |
Height float32 `xml:"height,omitempty"` | |
Married bool | |
Address | |
Comment string `xml:",comment"` | |
} | |
v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} | |
v.Comment = " Need more details. " | |
v.Address = Address{"Hanga Roa", "Easter Island"} | |
enc := xml.NewEncoder(os.Stdout) | |
enc.Indent(" ", " ") | |
if err := enc.Encode(v); err != nil { | |
fmt.Printf("error: %v\n", err) | |
} | |
// Output: | |
// <person id="13"> | |
// <name> | |
// <first>John</first> | |
// <last>Doe</last> | |
// </name> | |
// <age>42</age> | |
// <Married>false</Married> | |
// <City>Hanga Roa</City> | |
// <State>Easter Island</State> | |
// <!-- Need more details. --> | |
// </person> | |
} | |
// This example demonstrates unmarshaling an XML excerpt into a value with | |
// some preset fields. Note that the Phone field isn't modified and that | |
// the XML <Company> element is ignored. Also, the Groups field is assigned | |
// considering the element path provided in its tag. | |
func ExampleUnmarshal() { | |
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\n", v.XMLName) | |
fmt.Printf("Name: %q\n", v.Name) | |
fmt.Printf("Phone: %q\n", v.Phone) | |
fmt.Printf("Email: %v\n", v.Email) | |
fmt.Printf("Groups: %v\n", v.Groups) | |
fmt.Printf("Address: %v\n", v.Address) | |
// Output: | |
// XMLName: xml.Name{Space:"", Local:"Person"} | |
// Name: "Grace R. Emlin" | |
// Phone: "none" | |
// Email: [{home gre@example.com} {work gre@work.com}] | |
// Groups: [Friends Squash] | |
// Address: {Hanga Roa Easter Island} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment