Home | History | Annotate | Download | only in xml
      1 // Copyright 2012 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package xml_test
      6 
      7 import (
      8 	"encoding/xml"
      9 	"fmt"
     10 	"os"
     11 )
     12 
     13 func ExampleMarshalIndent() {
     14 	type Address struct {
     15 		City, State string
     16 	}
     17 	type Person struct {
     18 		XMLName   xml.Name `xml:"person"`
     19 		Id        int      `xml:"id,attr"`
     20 		FirstName string   `xml:"name>first"`
     21 		LastName  string   `xml:"name>last"`
     22 		Age       int      `xml:"age"`
     23 		Height    float32  `xml:"height,omitempty"`
     24 		Married   bool
     25 		Address
     26 		Comment string `xml:",comment"`
     27 	}
     28 
     29 	v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
     30 	v.Comment = " Need more details. "
     31 	v.Address = Address{"Hanga Roa", "Easter Island"}
     32 
     33 	output, err := xml.MarshalIndent(v, "  ", "    ")
     34 	if err != nil {
     35 		fmt.Printf("error: %v\n", err)
     36 	}
     37 
     38 	os.Stdout.Write(output)
     39 	// Output:
     40 	//   <person id="13">
     41 	//       <name>
     42 	//           <first>John</first>
     43 	//           <last>Doe</last>
     44 	//       </name>
     45 	//       <age>42</age>
     46 	//       <Married>false</Married>
     47 	//       <City>Hanga Roa</City>
     48 	//       <State>Easter Island</State>
     49 	//       <!-- Need more details. -->
     50 	//   </person>
     51 }
     52 
     53 func ExampleEncoder() {
     54 	type Address struct {
     55 		City, State string
     56 	}
     57 	type Person struct {
     58 		XMLName   xml.Name `xml:"person"`
     59 		Id        int      `xml:"id,attr"`
     60 		FirstName string   `xml:"name>first"`
     61 		LastName  string   `xml:"name>last"`
     62 		Age       int      `xml:"age"`
     63 		Height    float32  `xml:"height,omitempty"`
     64 		Married   bool
     65 		Address
     66 		Comment string `xml:",comment"`
     67 	}
     68 
     69 	v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
     70 	v.Comment = " Need more details. "
     71 	v.Address = Address{"Hanga Roa", "Easter Island"}
     72 
     73 	enc := xml.NewEncoder(os.Stdout)
     74 	enc.Indent("  ", "    ")
     75 	if err := enc.Encode(v); err != nil {
     76 		fmt.Printf("error: %v\n", err)
     77 	}
     78 
     79 	// Output:
     80 	//   <person id="13">
     81 	//       <name>
     82 	//           <first>John</first>
     83 	//           <last>Doe</last>
     84 	//       </name>
     85 	//       <age>42</age>
     86 	//       <Married>false</Married>
     87 	//       <City>Hanga Roa</City>
     88 	//       <State>Easter Island</State>
     89 	//       <!-- Need more details. -->
     90 	//   </person>
     91 }
     92 
     93 // This example demonstrates unmarshaling an XML excerpt into a value with
     94 // some preset fields. Note that the Phone field isn't modified and that
     95 // the XML <Company> element is ignored. Also, the Groups field is assigned
     96 // considering the element path provided in its tag.
     97 func ExampleUnmarshal() {
     98 	type Email struct {
     99 		Where string `xml:"where,attr"`
    100 		Addr  string
    101 	}
    102 	type Address struct {
    103 		City, State string
    104 	}
    105 	type Result struct {
    106 		XMLName xml.Name `xml:"Person"`
    107 		Name    string   `xml:"FullName"`
    108 		Phone   string
    109 		Email   []Email
    110 		Groups  []string `xml:"Group>Value"`
    111 		Address
    112 	}
    113 	v := Result{Name: "none", Phone: "none"}
    114 
    115 	data := `
    116 		<Person>
    117 			<FullName>Grace R. Emlin</FullName>
    118 			<Company>Example Inc.</Company>
    119 			<Email where="home">
    120 				<Addr>gre (a] example.com</Addr>
    121 			</Email>
    122 			<Email where='work'>
    123 				<Addr>gre (a] work.com</Addr>
    124 			</Email>
    125 			<Group>
    126 				<Value>Friends</Value>
    127 				<Value>Squash</Value>
    128 			</Group>
    129 			<City>Hanga Roa</City>
    130 			<State>Easter Island</State>
    131 		</Person>
    132 	`
    133 	err := xml.Unmarshal([]byte(data), &v)
    134 	if err != nil {
    135 		fmt.Printf("error: %v", err)
    136 		return
    137 	}
    138 	fmt.Printf("XMLName: %#v\n", v.XMLName)
    139 	fmt.Printf("Name: %q\n", v.Name)
    140 	fmt.Printf("Phone: %q\n", v.Phone)
    141 	fmt.Printf("Email: %v\n", v.Email)
    142 	fmt.Printf("Groups: %v\n", v.Groups)
    143 	fmt.Printf("Address: %v\n", v.Address)
    144 	// Output:
    145 	// XMLName: xml.Name{Space:"", Local:"Person"}
    146 	// Name: "Grace R. Emlin"
    147 	// Phone: "none"
    148 	// Email: [{home gre (a] example.com} {work gre (a] work.com}]
    149 	// Groups: [Friends Squash]
    150 	// Address: {Hanga Roa Easter Island}
    151 }
    152