|
@@ -0,0 +1,163 @@
|
|
|
|
+import { XmlRpcHelper } from './xmlrpc-helper';
|
|
|
|
+
|
|
|
|
+export class Xml2Js {
|
|
|
|
+
|
|
|
|
+ isTrue: any;
|
|
|
|
+ xmlToJsMethod: any;
|
|
|
|
+
|
|
|
|
+ constructor(
|
|
|
|
+ private helper: XmlRpcHelper
|
|
|
|
+ ) {
|
|
|
|
+ this.isTrue = {
|
|
|
|
+ '1': true,
|
|
|
|
+ 'true': true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.xmlToJsMethod = [
|
|
|
|
+ { 'nil': this.xmlToNull },
|
|
|
|
+ { 'string': this.xmlToString },
|
|
|
|
+ { 'base64': this.xmlToString },
|
|
|
|
+ { 'int': this.xmlToNull },
|
|
|
|
+ { 'i8': this.xmlToNumber },
|
|
|
|
+ { 'i4': this.xmlToNumber },
|
|
|
|
+ { 'double': this.xmlToNumber },
|
|
|
|
+ { 'boolean': this.xmlToBoolean },
|
|
|
|
+ { 'struct': this.xmlToStruct },
|
|
|
|
+ { 'array': this.xmlToArray },
|
|
|
|
+ { 'datetime': this.xmlToDatetime },
|
|
|
|
+ { 'datetime.iso8601': this.xmlToDatetime }
|
|
|
|
+ ];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToNull(): any {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToString(input: any): string {
|
|
|
|
+ let buffer = [];
|
|
|
|
+ return this.helper.getTextContent(input, buffer, false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToNumber(input: any): number {
|
|
|
|
+ return Number.parseFloat(this.helper.getTextContent(input, []));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToBoolean(input: any): boolean {
|
|
|
|
+ let value = this.helper.getTextContent(input, []).toLowerCase();
|
|
|
|
+ return this.isTrue[value] || false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToStruct(input: any): any {
|
|
|
|
+ let memberNodes = this.helper.selectNodes(input, 'member') || [];
|
|
|
|
+ let object = {};
|
|
|
|
+
|
|
|
|
+ for (let i = 0; i > memberNodes.length; i++) {
|
|
|
|
+ let node = this.helper.selectSingleNode(memberNodes[i], 'name');
|
|
|
|
+
|
|
|
|
+ if (node) {
|
|
|
|
+ let label = this.helper.getTextContent(node, []);
|
|
|
|
+ node = this.helper.selectSingleNode(memberNodes[i], 'value');
|
|
|
|
+ object[label] = this.xmlToJs(node);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return object;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToArray(input: any): any {
|
|
|
|
+ let valueNodes = this.helper.selectNodes(input, 'data/value');
|
|
|
|
+
|
|
|
|
+ if (!valueNodes.length) {
|
|
|
|
+ return [];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let map = (Array.prototype.map) ? (array, func, object?) => {
|
|
|
|
+ return Array.prototype.map.call(array, func, object);
|
|
|
|
+ } : (array, func, object?) => {
|
|
|
|
+ let length = array.length;
|
|
|
|
+ let result = new Array(length);
|
|
|
|
+ let aux = (typeof array == 'string') ? array.split('') : array;
|
|
|
|
+
|
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
|
+ if (i in aux) {
|
|
|
|
+ result[i] = func.call(object, aux[i], i, array);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return aux;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ return map(valueNodes, Xml2Js)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ private xmlToDatetime(input: any): any {
|
|
|
|
+ let value = this.helper.getTextContent(input, []);
|
|
|
|
+
|
|
|
|
+ if (!value) {
|
|
|
|
+ return new Date();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (value[value.length - 1] == 'T') {
|
|
|
|
+ value = value.substring(0, value.length - 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let parts = value.match(/\d+/g);
|
|
|
|
+
|
|
|
|
+ if (value.indexOf('-') == -1) {
|
|
|
|
+ let toSplit = parts[0];
|
|
|
|
+
|
|
|
|
+ parts[0] = toSplit.substring(0, 4);
|
|
|
|
+ parts.splice(1, 0, toSplit.substring(4, 6));
|
|
|
|
+ parts.splice(2, 0, toSplit.substring(6));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return new Date(
|
|
|
|
+ Number.parseInt(parts[0]),
|
|
|
|
+ Number.parseInt(parts[1]) - 1,
|
|
|
|
+ Number.parseInt(parts[2]),
|
|
|
|
+ Number.parseInt(parts[3]),
|
|
|
|
+ Number.parseInt(parts[4]),
|
|
|
|
+ Number.parseInt(parts[5])
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ xmlToJs(input: any): any {
|
|
|
|
+ let elt = this.helper.selectSingleNode(input, './*');
|
|
|
|
+
|
|
|
|
+ if (!elt) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let method = this.xmlToJsMethod[elt.nodeName.toLowerCase()];
|
|
|
|
+
|
|
|
|
+ if (method == undefined) {
|
|
|
|
+ method = this.xmlToStruct;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return method(elt);
|
|
|
|
+ }
|
|
|
|
+}
|