-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtag.go
118 lines (105 loc) · 2.01 KB
/
tag.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package xmlutils
import (
"strings"
"errors"
)
type XMLTag struct {
// Namespace это xml.Name.Space
Namespace string
// Tags это header:from>header:data>header:id
Tags []Tag
// Flags это:
// ,omitempty
// ,innerxml
// ,chardata
// ,attr
Flags []string
}
type Tag struct {
Prefix string
Value string
}
func (t Tag) String() string {
if t.Prefix == "" {
return t.Value
}
return t.Prefix+":"+t.Value
}
func (t *XMLTag) DeleteNSPrefix() {
for n, tag := range t.Tags {
tag := tag
tag.Prefix = ""
t.Tags[n] = tag
}
}
func (t *XMLTag) String() string {
var s string
if t.Namespace != "" {
s = t.Namespace+" "
}
tags := make([]string, len(t.Tags))
for n, tag := range t.Tags {
tags[n] = tag.String()
}
s = s+strings.Join(tags, ">")
if len(t.Flags) > 0 {
s = s+","+strings.Join(t.Flags, ",")
}
return s
}
func ParseXMLTag(s string) (*XMLTag, error) {
var err error
t := &XMLTag{}
if i := strings.Index(s, " "); i >= 0 {
t.Namespace, s = s[:i], s[i+1:]
}
tokens := strings.Split(s, ",")
switch len(tokens) {
case 0:
return nil, errors.New("empty tag")
case 1:
t.Tags, err = ParseTag(s)
if err != nil {
return nil, err
}
default:
t.Tags, err = ParseTag(tokens[0])
if err != nil {
return nil, err
}
t.Flags = tokens[1:]
}
return t, nil
}
func ParseTag(s string) ([]Tag, error) {
tokens := strings.Split(s, ">")
t := make([]Tag, len(tokens))
for n, token := range tokens {
tag := strings.Split(token, ":")
switch len(tag) {
case 0:
return t, errors.New("empty tag section")
case 1:
t[n] = Tag{
Value: token,
}
case 2:
t[n] = Tag{
Prefix: tag[0],
Value: tag[1],
}
default:
return t, errors.New("many tag prefix")
}
}
return t, nil
}
// DeleteNSPrefix удаляет префикс xml тега, оставляя все остальные элементы тега
func DeleteNSPrefix(tag string) (string, error) {
t, err := ParseXMLTag(tag)
if err != nil {
return "", err
}
t.DeleteNSPrefix()
return t.String(), nil
}