使用node包xml-js将SOAP响应text内容转结构化对象方案咨询
实现方案
整体处理流程
- 第一步从xml-js转换后的SOAP响应JSON中,按固定路径
elements[0].elements[0].elements[0].elements[0].elements[0].text提取原始文本内容,两类接口的原始文本都带有固定前缀00_,先统一去除该前缀 - 第二步根据接口类型调用对应的解析逻辑:FetchCust接口用键值对拆分逻辑,FetchUsage接口用XML二次解析逻辑
第一类FetchCust接口文本解析
去除前缀后的文本是键: 值, 键: 值的格式,部分值带有Cell:前缀,解析时直接剔除即可,代码示例:
function parseFetchCustText(rawText) { // 去除固定前缀 const content = rawText.replace(/^00_/, ''); const result = {}; // 拆分所有键值对 content.split(', ').forEach(item => { const [key, ...valParts] = item.split(': '); let value = valParts.join(': '); // 剔除值的Cell前缀 if (value.startsWith('Cell:')) { value = value.slice(5); } result[key] = value.trim(); }) return result; }
第二类FetchUsage接口文本解析
去除前缀后的文本是标准XML格式,直接复用已安装的xml-js做二次转换,提取Table节点转为数组即可,代码示例:
const convert = require('xml-js'); function parseFetchUsageText(rawText) { // 去除固定前缀 const xmlContent = rawText.replace(/^00_/, ''); // XML转JSON,compact模式更方便取值 const xmlJson = JSON.parse(convert.xml2json(xmlContent, {compact: true, spaces: 0})); // 兼容单条/多条Table数据,统一转为数组格式 const tableList = Array.isArray(xmlJson.NewDataSet.Table) ? xmlJson.NewDataSet.Table : [xmlJson.NewDataSet.Table]; // 提取每个节点的文本值,去掉冗余嵌套 return tableList.map(table => { const item = {}; Object.keys(table).forEach(field => { item[field] = table[field]._text; }) return item; }) }
完整调用示例
function processSoapResponse(soapJson, apiType) { // 提取原始text内容 const rawText = soapJson.elements?.[0]?.elements?.[0]?.elements?.[0]?.elements?.[0]?.elements?.[0]?.text; if (!rawText) throw new Error('响应内容为空'); if (apiType === 'FetchCust') { return parseFetchCustText(rawText); } else if (apiType === 'FetchUsage') { return parseFetchUsageText(rawText); } throw new Error('不支持的接口类型'); }
注意事项
- 解析前可先校验返回内容是否符合格式要求,避免空值、格式异常导致的报错
- 若接口返回的XML节点名存在拼写错误(如示例中的
AccounType少了字母t),可在解析后自行做字段名映射修正 - 若FetchCust接口的value中还有其他固定前缀需要剔除,可在对应解析函数中扩展处理逻辑
内容的提问来源于stack exchange,提问作者Adeola Oni
相关产品推荐
相关产品推荐

