import axios from 'axios' import JsZip from 'jszip' const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates'] /** * @description: 读取kmz文件解析出kml文件 * @param {string} filePath 文件地址 * @return {*} */ export const analyzeKmzFile = filePath => { return ( axios({ url: filePath, method: 'get', responseType: 'arraybuffer', authorization: false, }) // .get(filePath, { responseType: 'arraybuffer' },) .then(fileRes => fileRes.data) .then(kmzData => JsZip.loadAsync(kmzData)) // 解压kmz文件 .then(zipFile => { const files = {} Object.keys(zipFile.files).forEach(key => { files[key] = zipFile.files[key].async('text') }) return { zip: zipFile, fileInfoObj: files, } }) ) } export const getKmlParams = (source, isWpml, params) => { let regx = null if (isWpml) { if (params.mode) { regx = new RegExp( `${params.findRegx}<\\/wpml:${params.name}>`, params.mode ) } else { regx = new RegExp(`${params.findRegx}<\\/wpml:${params.name}>`) } } else { if (params.mode) { regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`, params.mode) } else { regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`) } } return source?.match(regx) } export const generateKmlFormat = settingParmas => { let paramGroup = '' Object.keys(settingParmas).forEach(key => { if (Object.prototype.toString.call(settingParmas[key]) === '[object Object]') { let parmaStr = '' Object.keys(settingParmas[key]).forEach(v => { const xml = noWmpl.includes(key) ? `<${v}>${settingParmas[key][v]}` : `${settingParmas[key][v]}` parmaStr += xml }) const xml = noWmpl.includes(key) ? `<${key}>${parmaStr}` : `${parmaStr}` paramGroup += xml } else { const xml = noWmpl.includes(key) ? `<${key}>${settingParmas[key]}` : `${settingParmas[key]}` paramGroup += xml } }) return paramGroup } /** * @description: JSON转XML * @param {any} obj 要转换的对象 * @param {string} rootName xml根节点名称 * @return {*} string */ export const JSONToXML = (obj, rootName, isEnd) => { let xml = '' const buildXml = (obj, rootName) => { let xml = '' if (Array.isArray(obj)) { obj.forEach(item => { const str = !noWmpl.includes(rootName) && isEnd ? 'wpml:' : '' xml += `<${str}${rootName}>${buildXml(item)}` }) } else if (typeof obj === 'object') { Object.keys(obj).forEach(key => { if (key === '#text') { xml += obj[key] } else { const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : '' if (key === 'Placemark') { xml += `${buildXml(obj[key], key)}` } else if (key === 'action') { if (Array.isArray(obj[key])) { xml += `${buildXml(obj[key], key)}` } else { xml += `<${str}${key}>${buildXml(obj[key], key)}` } } else { xml += `<${str}${key}>${buildXml(obj[key], key)}` } } }) } else { xml += obj } return xml } const header = isEnd ? '' : '' xml += `${header} ${buildXml(obj, rootName)} ` return xml } export const getTagNameFromXml = xmlString => { const parser = new DOMParser() const xmlDoc = parser.parseFromString(xmlString, 'text/xml') const element = xmlDoc.documentElement if (element && element.tagName) { return element.tagName // 返回的是类似 "WPML:USEGLOBALHEADINGPARAM" 的全大写形式 } return null } // 将xml转为json const deepParse = xml => { let obj = {} // 如果是文档节点,遍历其子节点 if (xml.nodeType === 1) { // element node // 处理子节点 if (xml.childNodes.length > 0) { for (let i = 0; i < xml.childNodes.length; i++) { const item = xml.childNodes[i] const nodeName = item.nodeName.replace('wpml:', '') // 检查是否是文本节点 if (item.nodeType === 3) { // text node // 处理文本节点的内容 if (item.nodeValue.trim() !== '') { obj[nodeName] = item.nodeValue.trim() } } else if (item.nodeType === 1) { // element node // 递归调用处理子节点 if (obj[nodeName] === undefined) { const nodeValue = deepParse(item) if (nodeValue[nodeName] === undefined) { obj[nodeName] = nodeValue } else { obj[nodeName] = nodeValue[nodeName] } } else { if (!obj[nodeName].push) { const old = obj[nodeName] obj[nodeName] = [] obj[nodeName].push(old) } const nodeValue = deepParse(item) if (nodeValue[nodeName] === undefined) { obj[nodeName].push(nodeValue) } } } } } } else if (xml.nodeType === 3) { // text node // 处理文本节点的内容 obj = xml.nodeValue.trim() } return obj } /** * @description: XML转JSON * @param {string} xmlStr xml字符串 * @return {*} string */ export const XMLToJSON = xmlStr => { const parser = new DOMParser() const xmlDoc = parser.parseFromString(xmlStr, 'text/xml') const xmlObj = deepParse(xmlDoc.documentElement) if (Reflect.has(xmlObj, 'Document')) { return xmlObj } else { return { Document: xmlObj, } } } export function removeTextKey(obj) { if (typeof obj !== 'object' || obj === null) { // 如果是数值字符串,转换为数值 if (typeof obj === 'string' && /^-?\d+(\.\d+)?$/.test(obj)) { return Number(obj); } return obj; } if (Array.isArray(obj)) { return obj.map(item => removeTextKey(item)); } if (Object.prototype.hasOwnProperty.call(obj, '#text')) { // 如果 #text 的值是数值字符串,转换为数值 const textValue = obj['#text']; return typeof textValue === 'string' && /^-?\d+(\.\d+)?$/.test(textValue) ? Number(textValue) : textValue; } const newObj = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = Object.keys(obj[key]).length === 0 ? '' : removeTextKey(obj[key]); } } return newObj; }