-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXMLElementUtil.ts
115 lines (101 loc) · 3.12 KB
/
XMLElementUtil.ts
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
import { XMLElement } from './XMLElement'
function seekForNS(node : any, parentNS : any) : any
{
if(!node.attributes)
return parentNS;
const ns : any = {};
for(const name in parentNS)
ns[name] = parentNS[name];
for(const name in node.attributes)
{
if(name.indexOf('xmlns:') === 0 || name === 'xmlns')
{
const value = node.attributes[name];
if(name === 'xmlns')
ns._default = value;
else
ns[name.substring('xmlns:'.length)] = value;
}
}
return ns;
}
export function mutateNodeNS(node : XMLElement, parentNS ?: { [name : string] : string }) : XMLElementUtil
export function mutateNodeNS(node : any, parentNS: { [name : string] : string } = { }) : XMLElementUtil
{
if(!node)
return undefined;
if(node.find)
return node as XMLElementUtil;
const nss = seekForNS(node, parentNS);
if(node.name)
{
for(const ns in nss)
{
if(ns === '_default' && node.name.indexOf(':') === -1)
{
node.name = nss[ns] + node.name;
break;
}
else if(node.name.indexOf(ns + ':') === 0)
{
node.name = nss[ns] + node.name.substring((ns + ':').length);
break;
}
}
}
node.findIndex = function(name : string) : number
{
for(let index = 0; index < node.elements.length; ++index)
if(node.elements[index] && node.elements[index].name && node.elements[index].name === name)
return index;
return -1;
}
node.find = function(name : string) : XMLElement
{
for(const element of node.elements)
if(element && element.name && element.name === name)
return element;
throw new Error('Cannot find the XML element : ' + name);
}
node.findMany = function(name : string) : XMLElement[]
{
const elements : XMLElement[] = [];
for(const element of node.elements)
if(element && element.name && element.name === name)
elements.push(element);
return elements;
}
node.findText = function() : string
{
for(const element of node.elements)
if(element && element.type === 'text')
return element.text;
return '';
}
node.findTexts = function() : string[]
{
const texts = [];
for(const element of node.elements)
if(element && element.type === 'text')
texts.push(element.text);
return texts;
}
if(node.elements)
node.elements.forEach(n => mutateNodeNS(n, nss))
else
node.elements = [];
return node as XMLElementUtil;
}
export interface XMLElementUtil extends XMLElement
{
declaration ?: any
attributes : any
elements : XMLElementUtil[]
name : string
type : string
findIndex(name : string) : number
find(name : string) : XMLElementUtil
findMany(name : string) : XMLElementUtil[]
findText() : string
findTexts() : string[]
}