Commit ee908748 authored by Russ Cox's avatar Russ Cox

encoding/xml: add (*Encoder).Indent

Exposing this on the Encoder allows streaming generation of indented XML.

R=golang-dev, rogpeppe
CC=golang-dev
https://golang.org/cl/7221075
parent 60731765
...@@ -50,6 +50,46 @@ func ExampleMarshalIndent() { ...@@ -50,6 +50,46 @@ func ExampleMarshalIndent() {
// </person> // </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 // This example demonstrates unmarshaling an XML excerpt into a value with
// some preset fields. Note that the Phone field isn't modified and that // 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 // the XML <Company> element is ignored. Also, the Groups field is assigned
......
...@@ -81,8 +81,7 @@ func Marshal(v interface{}) ([]byte, error) { ...@@ -81,8 +81,7 @@ func Marshal(v interface{}) ([]byte, error) {
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
var b bytes.Buffer var b bytes.Buffer
enc := NewEncoder(&b) enc := NewEncoder(&b)
enc.prefix = prefix enc.Indent(prefix, indent)
enc.indent = indent
if err := enc.Encode(v); err != nil { if err := enc.Encode(v); err != nil {
return nil, err return nil, err
} }
...@@ -99,6 +98,14 @@ func NewEncoder(w io.Writer) *Encoder { ...@@ -99,6 +98,14 @@ func NewEncoder(w io.Writer) *Encoder {
return &Encoder{printer{Writer: bufio.NewWriter(w)}} return &Encoder{printer{Writer: bufio.NewWriter(w)}}
} }
// Indent sets the encoder to generate XML in which each element
// begins on a new indented line that starts with prefix and is followed by
// one or more copies of indent according to the nesting depth.
func (enc *Encoder) Indent(prefix, indent string) {
enc.prefix = prefix
enc.indent = indent
}
// Encode writes the XML encoding of v to the stream. // Encode writes the XML encoding of v to the stream.
// //
// See the documentation for Marshal for details about the conversion // See the documentation for Marshal for details about the conversion
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment