-
Notifications
You must be signed in to change notification settings - Fork 78
/
phyloxml.js
80 lines (68 loc) · 1.82 KB
/
phyloxml.js
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
// Changes XML to JSON
// Modified version from here: http://davidwalsh.name/convert-xml-json
function xmlToJson(xml) {
// Create the return object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) { // text
obj = xml.nodeValue;
}
// do children
// If just one text node inside
if (xml.hasChildNodes() && xml.childNodes.length === 1 && xml.childNodes[0].nodeType === 3) {
obj = xml.childNodes[0].nodeValue;
}
else if (xml.hasChildNodes()) {
for(var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof(obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
}
var phyloxml_parser = function(xml, options) {
function parsePhyloxml(node, index) {
if (node.clade) {
node.clade.forEach(parsePhyloxml);
node.children = node.clade;
delete node.clade;
}
node.annotation = 1;
node.attribute = "0.01";
if (node.branch_length) {
node.attribute = node.branch_length;
}
if (node.taxonomy) {
node.name = node.taxonomy.scientific_name;
}
node.annotation = "";
}
var tree_json;
xml = xmlToJson(xml);
tree_json = xml.phyloxml.phylogeny.clade;
tree_json.name = "root";
parsePhyloxml(tree_json, 0);
return {
json: tree_json,
error: null
};
};
export default phyloxml_parser;