From 133c6bf77fffcbfa38ed58cf06808b38bbc374e0 Mon Sep 17 00:00:00 2001 From: Gustavo Niemeyer Date: Wed, 22 Feb 2012 23:37:57 -0200 Subject: [PATCH] encoding/xml: move Unmarshal example to function This also fixes MarshalIndent's example after the recent formatting convention changes. Fixes #2831. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5671062 --- src/pkg/encoding/xml/example_test.go | 73 ++++++++++++++++++++++++---- src/pkg/encoding/xml/read.go | 52 -------------------- 2 files changed, 63 insertions(+), 62 deletions(-) diff --git a/src/pkg/encoding/xml/example_test.go b/src/pkg/encoding/xml/example_test.go index 2f0c1747ce..6c5390766b 100644 --- a/src/pkg/encoding/xml/example_test.go +++ b/src/pkg/encoding/xml/example_test.go @@ -10,15 +10,6 @@ import ( "os" ) -// -// -// John -// Doe -// -// 42 -// false -// -// func ExampleMarshalIndent() { type Person struct { XMLName xml.Name `xml:"person"` @@ -34,10 +25,72 @@ func ExampleMarshalIndent() { v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} v.Comment = " Need more fields. " - output, err := xml.MarshalIndent(v, "\t", "\t") + output, err := xml.MarshalIndent(v, " ", " ") if err != nil { fmt.Printf("error: %v\n", err) } os.Stdout.Write(output) + // Output: + // + // + // John + // Doe + // + // 42 + // false + // + // +} + +// 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
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 Result struct { + XMLName xml.Name `xml:"Person"` + Name string `xml:"FullName"` + Phone string + Email []Email + Groups []string `xml:"Group>Value"` + } + p := Result{Name: "none", Phone: "none"} + + data := ` + + Grace R. Emlin + + gre@example.com + + + gre@work.com + + + Friends + Squash + +
123 Main Street
+
+ ` + err := xml.Unmarshal([]byte(data), &p) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Printf("XMLName: %#v\n", p.XMLName) + fmt.Printf("Name: %q\n", p.Name) + fmt.Printf("Phone: %q\n", p.Phone) + fmt.Printf("Email: %v\n", p.Email) + fmt.Printf("Groups: %v\n", p.Groups) + // 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] } diff --git a/src/pkg/encoding/xml/read.go b/src/pkg/encoding/xml/read.go index b5a3426a32..7f5601a7ad 100644 --- a/src/pkg/encoding/xml/read.go +++ b/src/pkg/encoding/xml/read.go @@ -25,58 +25,6 @@ import ( // slice, or string. Well-formed data that does not fit into v is // discarded. // -// For example, given these definitions: -// -// type Email struct { -// Where string `xml:",attr"` -// Addr string -// } -// -// type Result struct { -// XMLName xml.Name `xml:"result"` -// Name string -// Phone string -// Email []Email -// Groups []string `xml:"group>value"` -// } -// -// result := Result{Name: "name", Phone: "phone", Email: nil} -// -// unmarshalling the XML input -// -// -// -// gre@example.com -// -// -// gre@work.com -// -// Grace R. Emlin -// -// Friends -// Squash -// -//
123 Main Street
-//
-// -// via Unmarshal(data, &result) is equivalent to assigning -// -// r = Result{ -// xml.Name{Local: "result"}, -// "Grace R. Emlin", // name -// "phone", // no phone given -// []Email{ -// Email{"home", "gre@example.com"}, -// Email{"work", "gre@work.com"}, -// }, -// []string{"Friends", "Squash"}, -// } -// -// Note that the field r.Phone has not been modified and -// that the XML
element was discarded. Also, the field -// Groups was assigned considering the element path provided in the -// field tag. -// // Because Unmarshal uses the reflect package, it can only assign // to exported (upper case) fields. Unmarshal uses a case-sensitive // comparison to match XML element names to tag values and struct