github.com/rsc/go@v0.0.0-20150416155037-e040fd465409/src/encoding/xml/example_test.go (about)

     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@example.com</Addr>
   121  			</Email>
   122  			<Email where='work'>
   123  				<Addr>gre@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@example.com} {work gre@work.com}]
   149  	// Groups: [Friends Squash]
   150  	// Address: {Hanga Roa Easter Island}
   151  }