xml-to-json-util
Version:
xml-to-json-util is a simple and efficient utility library for converting XML data to JSON format easily.
43 lines (35 loc) • 1.34 kB
text/typescript
import { forEach, has, isString, reduce, nth, defaultTo } from 'lodash';
import * as safeJsonParse from 'safe-json-parse/tuple';
import * as xmljs from 'xml-js';
export const xmlToJsonUtil = <T = Record<string, any>>(initialXml: string, xmlReplacementPatterns: RegExp[] = []): T => {
if (!isString(initialXml)) {
throw `First paramater 'xml' must be a string`;
}
const xml = processXml(xmlReplacementPatterns, initialXml);
const options: xmljs.Options.XML2JSON = {
sanitize: true,
ignoreDoctype: true,
ignoreDeclaration: true,
ignoreInstruction: true,
ignoreAttributes: true,
ignoreCdata: true,
compact: true,
ignoreComment: true,
spaces: 2,
};
const parsedXml = defaultTo(nth(safeJsonParse(xmljs.xml2json(xml, options)), 1), {});
return flattenObjectProperties(parsedXml) as T;
};
const processXml = (xmlReplacementPatterns: RegExp[], xml: string): string =>
reduce(xmlReplacementPatterns, (acc: string, regex: RegExp) => acc.replace(regex, ''), xml);
const flattenObjectProperties = (obj: Record<string, any>): Record<string, any> => {
const propToFlatten: string = '_text';
forEach(obj, (_, key: string) => {
if (has(obj[key], propToFlatten)) {
obj[key] = obj[key][propToFlatten];
} else {
flattenObjectProperties(obj[key]);
}
});
return obj;
};