UNPKG

@rxap/xml-parser

Version:

Provides a set of decorators and services for parsing and serializing XML documents into TypeScript classes. It simplifies the process of mapping XML elements and attributes to class properties, handling data validation, and serializing objects back into

80 lines 3.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.XmlSerializerService = void 0; const reflect_metadata_1 = require("@rxap/reflect-metadata"); const metadata_keys_1 = require("./decorators/metadata-keys"); const element_1 = require("./element"); class XmlSerializerService { constructor(DOMParser, XMLSerializer, elementOptions = {}) { this.DOMParser = DOMParser; this.XMLSerializer = XMLSerializer; this.elementOptions = elementOptions; this.serialize = this.serialize.bind(this); } createElement(tagName, options) { const parser = this.createDOMParser(); return parser.parseFromString('<html></html>', 'application/xml').createElement(tagName, options); } /** * * * @param element */ serialize(instance, parent) { var _a, _b, _c; const { serializers, elementName } = this.determineElementNameAndSerializer(instance); const element = this.createElement(elementName); if ((_a = instance.__xmlns) === null || _a === void 0 ? void 0 : _a.size) { instance.__xmlns.forEach((value, key) => { if (key) { element.setAttribute(`xmlns:${key}`, value); } else { element.setAttribute('xmlns', value); } }); } if (parent) { parent.appendChild(element); } // create the ParsedElement instance of the current element const rxapElement = new element_1.RxapElement(element, this.DOMParser, this.elementOptions); (_b = instance.preSerialize) === null || _b === void 0 ? void 0 : _b.call(instance, rxapElement); for (const s of serializers) { try { s(this, rxapElement, instance); } catch (e) { console.debug({ instance, parent, element, serializer: s, serializers, }); throw new Error(`Error while serializing element '${elementName}' with serializer '${s.name}': ${e.message}`); } } (_c = instance.postSerialize) === null || _c === void 0 ? void 0 : _c.call(instance, rxapElement); return rxapElement; } determineElementNameAndSerializer(element) { var _a; const elementName = (0, reflect_metadata_1.getMetadata)(metadata_keys_1.ElementParserMetaData.NAME, element.constructor); const serializers = (_a = (0, reflect_metadata_1.getMetadata)(metadata_keys_1.ElementParserMetaData.SERIALIZER, element.constructor)) !== null && _a !== void 0 ? _a : []; return { elementName, serializers }; } serializeToXml(instance) { const element = this.serialize(instance); const serializer = this.createXMLSerializer(); return serializer.serializeToString(element.element); } createDOMParser() { return new this.DOMParser(); } createXMLSerializer() { return new this.XMLSerializer(); } } exports.XmlSerializerService = XmlSerializerService; //# sourceMappingURL=xml-serializer.service.js.map