diff --git a/nodes/core/parsers/70-CSV.html b/nodes/core/parsers/70-CSV.html
new file mode 100644
index 000000000..9429d1387
--- /dev/null
+++ b/nodes/core/parsers/70-CSV.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
diff --git a/nodes/core/parsers/70-CSV.js b/nodes/core/parsers/70-CSV.js
new file mode 100644
index 000000000..afe83900f
--- /dev/null
+++ b/nodes/core/parsers/70-CSV.js
@@ -0,0 +1,78 @@
+/**
+ * Copyright 2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var RED = require(process.env.NODE_RED_HOME+"/red/red");
+
+function CSVNode(n) {
+ RED.nodes.createNode(this,n);
+ this.template = n.temp.split(",");
+ this.sep = n.sep || ',';
+ this.sep = this.sep.replace("\\n","\n").replace("\\r","\r").replace("\\t","\t");
+ this.quo = '"';
+ var node = this;
+ this.on("input", function(msg) {
+ if (msg.hasOwnProperty("payload")) {
+ if (typeof msg.payload == "object") { // convert to csv
+ try {
+ var o = "";
+ for (var i in node.template) {
+ if (msg.payload.hasOwnProperty(node.template[i])) {
+ if (msg.payload[node.template[i]].indexOf(node.sep) != -1) {
+ o += node.quo + msg.payload[node.template[i]] + node.quo + node.sep;
+ }
+ else if (msg.payload[node.template[i]].indexOf(node.quo) != -1) {
+ msg.payload[node.template[i]] = msg.payload[node.template[i]].replace(/"/g, '""');
+ o += node.quo + msg.payload[node.template[i]] + node.quo + node.sep;
+ }
+ else { o += msg.payload[node.template[i]] + node.sep; }
+ }
+ }
+ msg.payload = o.slice(0,-1);
+ node.send(msg);
+ }
+ catch(e) { node.log(e); }
+ }
+ else if (typeof msg.payload == "string") { // convert to object
+ try {
+ var f = true;
+ var j = 0;
+ var k = [""];
+ var o = {};
+ for (var i = 0; i < msg.payload.length; i++) {
+ if (msg.payload[i] === node.quo) {
+ f = !f;
+ if (msg.payload[i-1] === node.quo) { k[j] += '\"'; }
+ }
+ else if ((msg.payload[i] === node.sep) && f) {
+ if ( node.template[j] && (node.template[j] != "") ) { o[node.template[j]] = k[j]; }
+ j += 1;
+ k[j] = "";
+ }
+ else {
+ k[j] += msg.payload[i];
+ }
+ }
+ if ( node.template[j] && (node.template[j] != "") ) { o[node.template[j]] = k[j]; }
+ msg.payload = o;
+ node.send(msg);
+ }
+ catch(e) { node.log(e); }
+ }
+ else { node.log("This node only handles csv strings or js objects."); }
+ }
+ });
+}
+RED.nodes.registerType("csv",CSVNode);
diff --git a/nodes/core/parsers/70-JSON.html b/nodes/core/parsers/70-JSON.html
new file mode 100644
index 000000000..dee989d63
--- /dev/null
+++ b/nodes/core/parsers/70-JSON.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
diff --git a/nodes/core/parsers/70-JSON.js b/nodes/core/parsers/70-JSON.js
new file mode 100644
index 000000000..b807cc2f1
--- /dev/null
+++ b/nodes/core/parsers/70-JSON.js
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var RED = require(process.env.NODE_RED_HOME+"/red/red");
+var util = require("util");
+
+function JSONNode(n) {
+ RED.nodes.createNode(this,n);
+ var node = this;
+ this.on("input", function(msg) {
+ if (msg.hasOwnProperty("payload")) {
+ if (typeof msg.payload === "string") {
+ try {
+ msg.payload = JSON.parse(msg.payload);
+ node.send(msg);
+ }
+ catch(e) { node.log(e+ "\n"+msg.payload); }
+ }
+ else if (typeof msg.payload === "object") {
+ if (!Buffer.isBuffer(msg.payload) ) {
+ if (!util.isArray(msg.payload)) {
+ msg.payload = JSON.stringify(msg.payload);
+ node.send(msg);
+ }
+ }
+ }
+ else { node.log("dropped: "+msg.payload); }
+ }
+ });
+}
+RED.nodes.registerType("json",JSONNode);
diff --git a/nodes/core/parsers/70-XML.html b/nodes/core/parsers/70-XML.html
new file mode 100644
index 000000000..a42415047
--- /dev/null
+++ b/nodes/core/parsers/70-XML.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
diff --git a/nodes/core/parsers/70-XML.js b/nodes/core/parsers/70-XML.js
new file mode 100644
index 000000000..52a2e1158
--- /dev/null
+++ b/nodes/core/parsers/70-XML.js
@@ -0,0 +1,50 @@
+/**
+ * Copyright 2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var RED = require(process.env.NODE_RED_HOME+"/red/red");
+var xml2js = require('xml2js');
+var parseString = xml2js.parseString;
+var builder = new xml2js.Builder({renderOpts:{pretty:false}});
+
+function XMLNode(n) {
+ RED.nodes.createNode(this,n);
+ var node = this;
+ this.on("input", function(msg) {
+ if (msg.hasOwnProperty("payload")) {
+ if (typeof msg.payload == "object") {
+ try {
+ msg.payload = builder.buildObject(msg.payload);
+ node.send(msg);
+ }
+ catch(e) { node.log(e); }
+ }
+ else if (typeof msg.payload == "string") {
+ try {
+ parseString(msg.payload, {strict:true,async:true}, function (err, result) {
+ if (err) { node.error(err); }
+ else {
+ msg.payload = result;
+ node.send(msg);
+ }
+ });
+ }
+ catch(e) { node.log(e); }
+ }
+ else { node.log("This node only handles xml strings or js objects."); }
+ }
+ });
+}
+RED.nodes.registerType("xml",XMLNode);