uni-app不支持原生XML解析,DOMParser在小程序和App端不可用;推荐使用适配版xml2js或UTS调用原生解析器,并注意XML编码问题。

uni-app本身不提供原生XML解析API,所有平台(H5、小程序、App)都需自行引入或封装解析逻辑。直接用DOMParser在H5可行,但在小程序和App端会报错或无响应——这是最常踩的坑。
为什么不能直接用DOMParser?
小程序环境没有window和document对象,DOMParser无法初始化;App端(尤其是uni-app x)运行在UTS/Kotlin/Swift上下文中,也不支持浏览器DOM API。强行调用会抛出ReferenceError: DOMParser is not defined或静默失败。
推荐方案:用xml2js轻量版(适配uni-app)
社区已有适配uni-app的xml2js简化版,不依赖DOM,纯JS实现,支持Promise解析。需手动引入而非npm install(因uni-app不支持Node.js内置模块):
- 下载精简版
xml2js.min.js(仅约8KB),放入static/lib/目录 - 在页面中用
import xml2js from '@/static/lib/xml2js.min.js' - 调用
xml2js.parseString(xmlStr, (err, result) => {...}),注意它仍是回调风格,可Promise包装
示例:
const parseXML = (xmlStr) => {
return new Promise((resolve, reject) => {
xml2js.parseString(xmlStr, (err, result) => {
if (err) reject(err)
else resolve(result)
})
})
}
// 使用
const res = await parseXML('<root><item id="1">A</item></root>')
console.log(res.root.item[0].$.id) // "1"
App端特殊处理:UTS中调用原生XML解析器
若XML来自Android/iOS原生模块(如NFC读取的身份证数据),建议在UTS中直接调用平台API,避免JS层解析性能损耗和编码问题:
- Android端:用
XmlPullParser(比SAXParser更轻、更稳定) - iOS端:用
XMLParser(Delegate模式,需继承XMLParserDelegate) - 关键点:UTS中声明的函数返回值类型必须是
any或明确结构体,不能返回Map/Dictionary等平台特有类型
例如Android UTS片段:
function parseIdCardXML(xml: string): any {
const parser = android.util.Xml.newPullParser()
parser.setInput(new java.io.StringReader(xml))
// ...逐事件解析,构造JSON-like对象
return { name: '张三', idno: '110...' }
}
容易被忽略的细节
XML编码问题最隐蔽:后端返回的UTF-8 XML若含BOM头,或服务端声明encoding="GBK"但实际发UTF-8,会导致解析后中文乱码。不要依赖uni.request自动解码——它只按HTTP头或默认UTF-8处理,对XML声明的encoding属性无感知。稳妥做法是:收到ArrayBuffer后手动用TextDecoder按真实编码解码,再传给解析器。


















