1 // Copyright 2009 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 // Copied and modified from Go 1.14 stdlib's encoding/xml
6 7 package xml
8 9 // A Name represents an XML name (Local) annotated
10 // with a name space identifier (Space).
11 // In tokens returned by Decoder.Token, the Space identifier
12 // is given as a canonical URL, not the short prefix used
13 // in the document being parsed.
14 type Name struct {
15 Space, Local string
16 }
17 18 // An Attr represents an attribute in an XML element (Name=Value).
19 type Attr struct {
20 Name Name
21 Value string
22 }
23 24 /*
25 NewAttribute returns a pointer to an attribute.
26 It takes in a local name aka attribute name, and value
27 representing the attribute value.
28 */
29 func NewAttribute(local, value string) Attr {
30 return Attr{
31 Name: Name{
32 Local: local,
33 },
34 Value: value,
35 }
36 }
37 38 /*
39 NewNamespaceAttribute returns a pointer to an attribute.
40 It takes in a local name aka attribute name, and value
41 representing the attribute value.
42 43 NewNamespaceAttribute appends `xmlns:` in front of namespace
44 prefix.
45 46 For creating a name space attribute representing
47 `xmlns:prefix="http://example.com`, the breakdown would be:
48 local = "prefix"
49 value = "http://example.com"
50 */
51 func NewNamespaceAttribute(local, value string) Attr {
52 attr := NewAttribute(local, value)
53 54 // default name space identifier
55 attr.Name.Space = "xmlns"
56 return attr
57 }
58 59 // A StartElement represents an XML start element.
60 type StartElement struct {
61 Name Name
62 Attr []Attr
63 }
64 65 // Copy creates a new copy of StartElement.
66 func (e StartElement) Copy() StartElement {
67 attrs := make([]Attr, len(e.Attr))
68 copy(attrs, e.Attr)
69 e.Attr = attrs
70 return e
71 }
72 73 // End returns the corresponding XML end element.
74 func (e StartElement) End() EndElement {
75 return EndElement{e.Name}
76 }
77 78 // returns true if start element local name is empty
79 func (e StartElement) isZero() bool {
80 return len(e.Name.Local) == 0
81 }
82 83 // An EndElement represents an XML end element.
84 type EndElement struct {
85 Name Name
86 }
87 88 // returns true if end element local name is empty
89 func (e EndElement) isZero() bool {
90 return len(e.Name.Local) == 0
91 }
92