使用fast-xml-parser解析XML时,如何将type=Text的数值转为字符串?
问题:fast-xml-parser解析XML时,指定节点的纯数字值需转为字符串
我使用fast-xml-parser和TypeScript解析XML时遇到一个问题:带连字符的值会被识别为字符串,但纯数字值会被解析成数字类型。我需要将所有type属性为Text的<u6:value>节点内容统一转为字符串(比如示例中的789555要和123-456一样以字符串形式输出),且不能修改其他属性的格式。之前尝试使用tagValueProcessor未得到预期结果,求可行解决方案。
现有代码
private xmlParser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '', removeNSPrefix: true, commentPropName: '#comment' }) xmlParser.parse(requestxml)
输入XML
<u5:items> <u5:item name="amz.myid"> <u6:values> <u6:value type="Text" isNegative="false">123-456</u6:value> <u6:value type="Text" isNegative="false">789555</u6:value> </u6:values> </u5:item> </u5:items>
实际输出
{ "items": { "item": { "values": { "value": [ { "#text": "123-456", "type": "Text", "isNegative": "false" }, { "#text": 789555, // 需要转为字符串 "type": "Text", "isNegative": "false" } ], "#text": "/u6:values>" }, "name": "amz.myid" } } }
预期输出
{ "items": { "item": { "values": { "value": [ { "#text": "123-456", "type": "Text", "isNegative": "false" }, { "#text": "789555", "type": "Text", "isNegative": "false" } ], "#text": "/u6:values>" }, "name": "amz.myid" } } }
解决方案
单独使用tagValueProcessor无法实现需求,因为它处理值时无法获取节点的属性信息。需要结合postProcess钩子,在解析完成后精准定位目标节点并修改值类型:
private xmlParser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '', removeNSPrefix: true, commentPropName: '#comment', processEntities: false, // 关闭实体处理,避免干扰原始值 postProcess: (nodePath, node, isAttribute) => { // 仅处理非属性节点、名为value且type属性为Text的节点 if (!isAttribute && node.type === 'Text' && nodePath.endsWith('value')) { if (typeof node['#text'] === 'number') { node['#text'] = node['#text'].toString(); } } return node; } }); xmlParser.parse(requestxml);
方案说明
postProcess钩子允许在解析完成后遍历每个节点,同时能获取节点的属性和路径信息,可精准定位到目标<u6:value>节点(因removeNSPrefix已去掉命名空间,节点名为value)。- 仅对
type为Text的value节点的#text字段做判断:若为数字类型则转为字符串,不会修改其他节点或属性的格式。 processEntities: false确保原始文本值不被额外处理,保证转换的准确性。
执行上述代码后,解析结果将符合预期输出,所有type="Text"的value节点内容均为字符串类型,其他格式保持不变。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

