跳转到内容

XML 解析

@XmlDecorator() 是一个参数装饰器,用于解析 XML 请求体并转换为 JavaScript 对象。

基础用法

typescript
import { XmlDecorator } from '@maxtan/nest-core'

@Post('webhook')
handleXml(@XmlDecorator() data: any) {
  // data 为解析后的 XML 对象
  return data
}

输入:

xml
<root>
  <user name="John">
    <age>30</age>
  </user>
</root>

输出:

json
{
  "root": {
    "user": {
      "@_name": "John",
      "age": 30
    }
  }
}

解包根节点

使用 unwrap: true 自动移除根元素包装:

typescript
@Post('webhook')
handleXml(@XmlDecorator({ unwrap: true }) data: any) {
  // <root><user>...</user></root> → { user: ... }
  return data
}

自定义解析选项

传入 fast-xml-parserX2jOptions 自定义解析行为:

typescript
@Post('webhook')
handleXml(
  @XmlDecorator({
    parserOptions: {
      ignoreAttributes: true,       // 忽略属性
      parseTagValue: false,         // 不自动转换值类型
      attributeNamePrefix: '',      // 属性名前缀
    }
  })
  data: any
) {
  return data
}

默认解析器配置

选项默认值说明
ignoreAttributesfalse是否忽略 XML 属性
attributeNamePrefix@_属性名前缀
textNodeName#text文本节点名称
parseTagValuetrue自动转换值类型
parseAttributeValuetrue自动转换属性值类型
trimValuestrue去除值前后空格

选项

typescript
interface XmlDecoratorOptions {
  /** 自定义 fast-xml-parser 解析选项 */
  parserOptions?: X2jOptions
  /** 是否自动解包根节点,默认 false */
  unwrap?: boolean
}

错误处理

场景异常消息
XML 格式错误BadRequestExceptionXML 解析失败: ...
读取流失败BadRequestExceptionXML 读取失败: ...
解析超时BadRequestExceptionXML 解析超时 (10000ms)

性能优化

  • 默认解析器实例全局复用
  • 自定义配置的解析器实例缓存(最多 16 个)
  • 超出缓存上限时自动淘汰最早的实例

依赖

需要安装 fast-xml-parser

bash
pnpm add fast-xml-parser

最佳实践

  1. 使用 unwrap: true:大多数场景不需要根节点包装,建议默认解包
  2. 保留默认配置:除非有特殊需求,尽量使用默认解析器配置(可复用全局实例,性能更优)
  3. 配合异常过滤器:XML 解析失败自动抛出 BadRequestException,已被 AllExceptionsFilter 统一处理

相关文档