xml: add CopyToken

R=rsc
CC=golang-dev
https://golang.org/cl/634042
This commit is contained in:
Kyle Consalus 2010-03-23 09:43:20 -07:00 committed by Russ Cox
parent 9e0ae94e72
commit 66caa38d49
2 changed files with 52 additions and 2 deletions

View file

@ -55,6 +55,13 @@ type StartElement struct {
Attr []Attr
}
func (e StartElement) Copy() StartElement {
attrs := make([]Attr, len(e.Attr))
copy(e.Attr, attrs)
e.Attr = attrs
return e
}
// An EndElement represents an XML end element.
type EndElement struct {
Name Name
@ -100,6 +107,23 @@ type readByter interface {
ReadByte() (b byte, err os.Error)
}
// CopyToken returns a copy of a Token.
func CopyToken(t Token) Token {
switch v := t.(type) {
case CharData:
return v.Copy()
case Comment:
return v.Copy()
case Directive:
return v.Copy()
case ProcInst:
return v.Copy()
case StartElement:
return v.Copy()
}
return t
}
// A Parser represents an XML parser reading a particular input stream.
// The parser assumes that its input is encoded in UTF-8.
type Parser struct {
@ -180,8 +204,8 @@ func NewParser(r io.Reader) *Parser {
//
// Slices of bytes in the returned token data refer to the
// parser's internal buffer and remain valid only until the next
// call to Token. To acquire a copy of the bytes, call the token's
// Copy method.
// call to Token. To acquire a copy of the bytes, call CopyToken
// or the token's Copy method.
//
// Token expands self-closing elements such as <br/>
// into separate start and end elements returned by successive calls.