mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
parent
9e0ae94e72
commit
66caa38d49
2 changed files with 52 additions and 2 deletions
|
|
@ -55,6 +55,13 @@ type StartElement struct {
|
||||||
Attr []Attr
|
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.
|
// An EndElement represents an XML end element.
|
||||||
type EndElement struct {
|
type EndElement struct {
|
||||||
Name Name
|
Name Name
|
||||||
|
|
@ -100,6 +107,23 @@ type readByter interface {
|
||||||
ReadByte() (b byte, err os.Error)
|
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.
|
// A Parser represents an XML parser reading a particular input stream.
|
||||||
// The parser assumes that its input is encoded in UTF-8.
|
// The parser assumes that its input is encoded in UTF-8.
|
||||||
type Parser struct {
|
type Parser struct {
|
||||||
|
|
@ -180,8 +204,8 @@ func NewParser(r io.Reader) *Parser {
|
||||||
//
|
//
|
||||||
// Slices of bytes in the returned token data refer to the
|
// Slices of bytes in the returned token data refer to the
|
||||||
// parser's internal buffer and remain valid only until the next
|
// 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
|
// call to Token. To acquire a copy of the bytes, call CopyToken
|
||||||
// Copy method.
|
// or the token's Copy method.
|
||||||
//
|
//
|
||||||
// Token expands self-closing elements such as <br/>
|
// Token expands self-closing elements such as <br/>
|
||||||
// into separate start and end elements returned by successive calls.
|
// into separate start and end elements returned by successive calls.
|
||||||
|
|
|
||||||
|
|
@ -328,3 +328,29 @@ func TestUnquotedAttrs(t *testing.T) {
|
||||||
t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
|
t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCopyTokenCharData(t *testing.T) {
|
||||||
|
data := []byte("same data")
|
||||||
|
var tok1 Token = CharData(data)
|
||||||
|
tok2 := CopyToken(tok1)
|
||||||
|
if !reflect.DeepEqual(tok1, tok2) {
|
||||||
|
t.Error("CopyToken(CharData) != CharData")
|
||||||
|
}
|
||||||
|
data[1] = 'o'
|
||||||
|
if reflect.DeepEqual(tok1, tok2) {
|
||||||
|
t.Error("CopyToken(CharData) uses same buffer.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCopyTokenStartElement(t *testing.T) {
|
||||||
|
elt := StartElement{Name{"", "hello"}, []Attr{Attr{Name{"", "lang"}, "en"}}}
|
||||||
|
var tok1 Token = elt
|
||||||
|
tok2 := CopyToken(tok1)
|
||||||
|
if !reflect.DeepEqual(tok1, tok2) {
|
||||||
|
t.Error("CopyToken(StartElement) != StartElement")
|
||||||
|
}
|
||||||
|
elt.Attr[0] = Attr{Name{"", "lang"}, "de"}
|
||||||
|
if reflect.DeepEqual(tok1, tok2) {
|
||||||
|
t.Error("CopyToken(CharData) uses same buffer.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue