Angular 8中转换含HTML字符串的XML为JSON的解决方案求助
解决方案
方案1:调整fast-xml-parser配置(推荐)
你之前尝试过的fast-xml-parser本身支持指定节点停止解析子标签,直接将节点内所有内容作为纯字符串处理,不需要更换其他依赖包。
操作步骤
- 安装兼容Angular 8的版本:
npm install fast-xml-parser@3.21.1
- 解析时添加对应配置即可得到目标结果:
import { parse } from 'fast-xml-parser'; const xmlContent = ` <title> <html> <p>test</p> </html> </title> `; const parserOptions = { ignoreAttributes: true, trimValues: true, // 配置遇到title标签时,直接提取内部原始内容作为值,不解析子标签 stopNodes: ['title'], // 自动去除内容里的换行和多余空格,匹配预期输出格式 tagValueProcessor: (tagName, tagValue) => { if (tagName === 'title') { return tagValue.replace(/\s+/g, ' ').replace(/>\s+</g, '><').trim(); } return tagValue; } }; const result = parse(xmlContent, parserOptions); console.log(result);
输出结果完全符合需求:
{ "title": "<html><p>test</p></html>" }
方案2:自定义预处理+xml2js方案
如果需要兼容更多自定义场景,可以先预处理XML,将需要保留HTML内容的标签内部的尖括号先转义,解析完成后再反转义即可:
import { parseString } from 'xml2js'; const xmlContent = ` <title> <html> <p>test</p> </html> </title> `; // 预处理:转义title标签内的<和> const processedXml = xmlContent.replace(/<title>([\s\S]*?)<\/title>/g, (match, content) => { const escapedContent = content.replace(/</g, '<').replace(/>/g, '>'); return `<title>${escapedContent}</title>`; }); parseString(processedXml, { trim: true, explicitArray: false }, (err, result) => { // 反转义得到原始HTML内容 result.title = result.title.replace(/</g, '<').replace(/>/g, '>').replace(/\s+/g, ' ').replace(/>\s+</g, '><').trim(); console.log(result); });
两种方案都可以在Angular 8环境下直接运行,无额外兼容问题。
内容的提问来源于stack exchange,提问作者Raviteja Voleti
相关产品推荐
相关产品推荐

