forked from clbanning/mxj
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathx2j.go
145 lines (127 loc) · 3.97 KB
/
x2j.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Copyright 2012-2014 Charles Banning. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file
// x2j - for (mostly) backwards compatibility with x2j package
package mxj
// Wrappers for end-to-end XML to JSON transformation.
/*
import "io"
// FromXml() --> ToJson().
func XmlToJson(xmlVal []byte, safeEncoding ...bool) ([]byte, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
return m.Json(safeEncoding...)
}
// FromXml() --> ToJsonWriter().
func XmlToJsonWriter(xmlVal []byte, jsonWriter io.Writer, safeEncoding ...bool) (*[]byte, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
return m.JsonWriter(jsonWriter, safeEncoding...)
}
// FromXmlReader() --> ToJson().
func XmlReaderToJson(xmlReader io.Reader, safeEncoding ...bool) ([]byte, *[]byte, error) {
m, raw, merr := NewMapXmlReader(xmlReader)
if merr != nil {
return nil, raw, merr
}
j, jerr := m.Json(safeEncoding...)
return j, raw, jerr
}
// FromXmlReader() --> ToJsonWriter(). Handy for bulk transformation of documents.
func XmlReaderToJsonWriter(xmlReader io.Reader, jsonWriter io.Writer, safeEncoding ...bool) (*[]byte, *[]byte, error) {
m, xraw, merr := NewMapXmlReader(xmlReader)
if merr != nil {
return xraw, nil, merr
}
jraw, jerr := m.JsonWriter(jsonWriter, safeEncoding...)
return xraw, jraw, jerr
}
*/
// XML wrappers for Map methods implementing tag path and value functions.
/*
// Wrap PathsForKey for XML.
func XmlPathsForTag(xmlVal []byte, tag string) ([]string, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
paths := m.PathsForKey(tag)
return paths, nil
}
// Wrap PathForKeyShortest for XML.
func XmlPathForTagShortest(xmlVal []byte, tag string) (string, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return "", merr
}
path := m.PathForKeyShortest(tag)
return path, nil
}
// Wrap ValuesForKey for XML.
// 'attrs' are key:value pairs for attributes, where key is attribute label prepended with a hypen, '-'.
func XmlValuesForTag(xmlVal []byte, tag string, attrs ...string) ([]interface{}, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
return m.ValuesForKey(tag, attrs...)
}
// Wrap ValuesForPath for XML.
// 'attrs' are key:value pairs for attributes, where key is attribute label prepended with a hypen, '-'.
func XmlValuesForTagPath(xmlVal []byte, path string, attrs ...string) ([]interface{}, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
return m.ValuesForPath(path, attrs...)
}
// Wrap UpdateValuesForPath for XML
// 'xmlVal' is XML value
// 'newTagValue' is the value to replace an existing value at the end of 'path'
// 'path' is the dot-notation path with the tag whose value is to be replaced at the end
// (can include wildcard character, '*')
// 'subkeys' are key:value pairs of tag:values that must match for the tag
func XmlUpdateValsForPath(xmlVal []byte, newTagValue interface{}, path string, subkeys ...string) ([]byte, error) {
m, merr := NewMapXml(xmlVal)
if merr != nil {
return 0, err
}
n, err := m.UpdateValuesForPath(newTagValue, path, subkeys...)
if err != nil {
return nil, err
}
return m.Xml()
}
// Wrap NewMap for XML and return as XML
// 'xmlVal' is an XML value
// 'tagpairs' are "oldTag:newTag" values that conform to 'keypairs' in (Map)NewMap.
func XmlNewXml(xmlVal []byte, tagpairs ...string) ([]byte, error) (
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
n, nerr := m.NewMap(tagpairs...)
if nerr != nil {
return nil, nerr
}
return n.Xml()
}
// Wrap NewMap for XML and return as JSON
// 'xmlVal' is an XML value
// 'tagpairs' are "oldTag:newTag" values that conform to 'keypairs' in (Map)NewMap.
func XmlNewJson(xmlVal []byte, tagpairs ...string) ([]byte, error) (
m, merr := NewMapXml(xmlVal)
if merr != nil {
return nil, merr
}
n, nerr := m.NewMap(tagpairs...)
if nerr != nil {
return nil, nerr
}
return n.Json()
}
*/