使用Axios调用Zillow API获取XML数据后无法访问指定字段的问题
解决Axios调用Zillow API返回XML无法访问属性的问题
嘿,我之前也踩过这个坑!你现在遇到的问题核心是:Axios默认不会自动解析XML格式的响应——它会把返回的XML数据当成普通的字符串存在res.data里,所以你直接用res.data.request.address这种对象属性访问的方式,自然会得到undefined。
下面是具体的解决步骤:
1. 安装XML解析库
首先你需要一个能把XML字符串转换成JavaScript对象的库,推荐使用xml2js(社区常用,配置灵活),执行安装命令:
npm install xml2js # 或者用yarn yarn add xml2js
2. 手动解析XML响应
拿到Axios返回的XML字符串后,用xml2js把它转换成可访问的JS对象。这里给你一个完整的示例:
const axios = require('axios'); const xml2js = require('xml2js'); // 发起Zillow API请求 axios.get('https://www.zillow.com/webservice/GetSearchResults.htm', { params: { zws_id: '你的Zillow API密钥', address: '目标地址', citystatezip: '城市/州/邮编' // 其他必填参数 } }) .then(response => { // 解析XML字符串为JS对象,关闭自动数组转换让结构更简洁 xml2js.parseString(response.data, { explicitArray: false }, (parseErr, parsedData) => { if (parseErr) { console.error('XML解析失败:', parseErr); return; } // 现在可以正常访问数据了! // 注意:路径要根据Zillow XML的实际结构调整,先打印parsedData确认结构 console.log('请求的地址:', parsedData.searchresults.request.address); console.log('请求的城市:', parsedData.searchresults.request.citystatezip); }); }) .catch(requestErr => { console.error('API请求出错:', requestErr); });
3. 可选:配置Axios自动解析XML
如果经常调用XML接口,可以给Axios配置transformResponse,让它自动把XML转换成对象,不用每次手动解析:
const axios = require('axios'); const xml2js = require('xml2js'); // 创建XML解析器实例,关闭自动数组转换 const xmlParser = new xml2js.Parser({ explicitArray: false }); // 创建自定义Axios实例 const zillowAxios = axios.create({ baseURL: 'https://www.zillow.com/webservice/', transformResponse: [function(data) { // 把XML解析逻辑封装成Promise return new Promise((resolve, reject) => { xmlParser.parseString(data, (err, result) => { if (err) reject(err); else resolve(result); }); }); }] }); // 现在调用API时,res.data直接是解析后的对象 zillowAxios.get('GetSearchResults.htm', { params: { zws_id: '你的API密钥', // 其他参数 } }) .then(res => { console.log('请求地址:', res.data.searchresults.request.address); }) .catch(err => { console.error('请求失败:', err); });
关键提示
- 先打印
parsedData(或者res.data)看看实际的对象结构,因为XML节点可能会被解析成嵌套对象或数组,Zillow的XML根节点是<searchresults>,所以路径大概率是searchresults.request.address,但还是要以实际解析后的结构为准。 - 如果你的项目用的是ES模块(import语法),只需要把
require换成import即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者born2gamble
相关产品推荐
相关产品推荐

