eBay API将XML解析为Google脚本时出现问题 修改点:修改后的脚本:参考:修改后的脚本:

如何解决eBay API将XML解析为Google脚本时出现问题 修改点:修改后的脚本:参考:修改后的脚本:

我正在尝试调用eBay API GetMyeBaySelling,我可以使Act,Timestamp,Version和Build返回并将其写入Google表格,但是无论如何,我都无法返回“ Item”列表。响应在下面,我需要获得其他任何字段的帮助。可以说我想遍历所有返回的清单并返回“ BuyItNowPrice”。我已经尝试了下面的代码,但很快就没了。

我更习惯于Excel VBA,但尝试过渡到Google表格脚本。

API响应:

[20-09-15 19:52:46:012 BST] Logging output too large. Truncating output. <?xml version="1.0" encoding="UTF-8"?>
<GetMyeBaySellingResponse xmlns="urn:ebay:apis:eBLBaseComponents"><Timestamp>2020-09-15T18:52:45.627Z</Timestamp><Ack>Success</Ack><Version>1163</Version><Build>E1163_CORE_APISELLING_19187371_R1</Build><ActiveList><ItemArray><Item><BuyItNowPrice currencyID="GBP">3.99</BuyItNowPrice><ItemID>##########</ItemID><ListingDetails><StartTime>2011-09-16T10:51:54.000Z</StartTime><ViewItemURL>https://www.ebay.co.uk/itm/???????????????????????????-/############</ViewItemURL><ViewItemURLForNaturalSearch>http://cgi.ebay.co.uk/????????item=############&amp;category=51169&amp;cmd=ViewItem</ViewItemURLForNaturalSearch></ListingDetails><ListingDuration>GTC</ListingDuration><ListingType>StoresFixedPrice</ListingType><Quantity>70</Quantity><SellingStatus><CurrentPrice currencyID="GBP">3.99</CurrentPrice></SellingStatus><ShippingDetails><ShippingServiceOptions><ShippingServiceCost currencyID="GBP">0.0</ShippingServiceCost></ShippingServiceOptions><ShippingType>Flat</ShippingType></ShippingDetails><TimeLeft>PT15H59M9S</TimeLeft><Title>????????????????????????????</Title><WatchCount>3</WatchCount><QuestionCount>3</QuestionCount><QuantityAvailable>0</QuantityAvailable><SKU>???????</SKU><PictureDetails><GalleryURL>http://thumbs.ebaystatic.com/pict/???????????_5.jpg</GalleryURL></PictureDetails><NewLeadCount>3</NewLeadCount><ClassifiedAdPayPerLeadFee currencyID="GBP">0.0</ClassifiedAdPayPerLeadFee><SellerProfiles><SellerShippingProfile><ShippingProfileID>??????????</ShippingProfileID><ShippingProfileName>Flat:Royal Mail 2nd(Free),Royal Mail Tra,Same#79</ShippingProfileName></SellerShippingProfile><SellerReturnProfile><ReturnProfileID>????????????</ReturnProfileID><ReturnProfileName>Returns Accepted,Buyer,30 days#2</ReturnProfileName></SellerReturnProfile><SellerPaymentProfile><PaymentProfileID>124284320022</PaymentProfileID><PaymentProfileName>PayPal#0</PaymentProfileName></SellerPaymentProfile></SellerProfiles><HideFromSearch>true</HideFromSearch><ReasonHideFromSearch>OutOfStock</ReasonHideFromSearch><OutOfStockControl>true</OutOfStockControl></Item><Item>

我的代码:

    var response = UrlFetchApp.fetch(site,options);

  
   var document = XmlService.parse(response);
  Logger.log(response);
  var root = document.getRootElement();
  var NS = XmlService.getNamespace("urn:ebay:apis:eBLBaseComponents");
   
  var ack = root.getChildText('Ack',NS);
  var time = root.getChildText('Timestamp',NS);
  var version = root.getChildText('Version',NS);
  var build = root.getChildText('Build',NS);
  var shortmessage = root.getChildText('ShortMessage',NS);
   //Logger.log(shortmessage);  
  var longmessage = root.getChildText('LongMessage',NS);
   //Logger.log(longmessage);
  
  var itms = root.getChild('ActiveList',NS).getChild('ItemArray',NS).getChild('BuyItNowPrice',NS);
        Logger.log(itms + '1st Log');
  for (var i = 0; i < itms.length; i++) {
    var item = itms[i].getChild('Item',NS).getText();
      Logger.log(item + '2nd Log');
  }

    //sheet.getRange('A2').setValue(xml);
   var LstSheet = sheet.getLastRow()+1
   sheet.getRange(LstSheet,1).setValue([ack]);
   sheet.getRange(LstSheet,2).setValue([time]);
   sheet.getRange(LstSheet,3).setValue([version]);
   sheet.getRange(LstSheet,4).setValue([build]);
   sheet.getRange(LstSheet,5).setValue([shortmessage]);
   sheet.getRange(LstSheet,6).setValue([longmessage]);


预先感谢

更新:16-09-2020 @ 17:08hrs英国:好的,我现在有工作代码,它将数据写入工作表,但是在4列中写入200条记录大约需要82秒。将数据写入数组然后将其添加到工作表会更快吗?如果速度更快,您可以举个例子。实际上,最好还是看看如何将其写入数组,然后再写入工作表,这样我才能学到更多。

我的工作代码:

  var itms = root.getChild('ActiveList',NS).getChildren();
  for (var i = 0; i < itms.length; i++) {
    
    var item = itms[i].getChild('ItemID',NS).getText();
    var title = itms[i].getChild('Title',NS).getText()
    var url = itms[i].getChild('ListingDetails',NS).getChild('ViewItemURLForNaturalSearch',NS).getText()
    var imgurl = itms[i].getChild('PictureDetails',NS).getChild('GalleryURL',NS).getText()
    
    
    sheet.appendRow([item,title,url,imgurl]);

解决方法

我相信您的目标如下。

  • 您要使用Google Apps脚本从BuyItNowPrice检索ItemArray的值。
  • response中的
  • var response = UrlFetchApp.fetch(site,options);位于“ API响应:”中。

修改点:

  • 我认为在您所质疑的XML数据中,root.getChild('ActiveList',NS).getChild('ItemArray',NS).getChild('BuyItNowPrice',NS)返回了null。在这种情况下,必须为var itms = root.getChild('ActiveList',NS).getChildren();
  • 在for循环中,必须为var item = itms[i].getChild('BuyItNowPrice',NS).getText();

当以上几点反映到您的脚本时,它如下所示。

修改后的脚本:

从:
var itms = root.getChild('ActiveList',NS);
      Logger.log(itms + '1st Log');
for (var i = 0; i < itms.length; i++) {
  var item = itms[i].getChild('Item',NS).getText();
    Logger.log(item + '2nd Log');
}
至:
var itms = root.getChild('ActiveList',NS).getChildren();
for (var i = 0; i < itms.length; i++) {
  var item = itms[i].getChild('BuyItNowPrice',NS).getText();
  Logger.log(item);
}

使用“ API响应:”中的XML数据时,示例脚本如下。

function myFunction() {
  var response = `<?xml version="1.0" encoding="UTF-8"?>
<GetMyeBaySellingResponse
    xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2020-09-15T18:52:45.627Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1163</Version>
    <Build>E1163_CORE_APISELLING_19187371_R1</Build>
    <ActiveList>
        <ItemArray>
            <Item>
                <BuyItNowPrice currencyID="GBP">3.99</BuyItNowPrice>
                <ItemID>##########</ItemID>
                <ListingDetails>
                    <StartTime>2011-09-16T10:51:54.000Z</StartTime>
                    <ViewItemURL>https://www.ebay.co.uk/itm/???????????????????????????-/############</ViewItemURL>
                    <ViewItemURLForNaturalSearch>http://cgi.ebay.co.uk/????????item=############&amp;category=51169&amp;cmd=ViewItem</ViewItemURLForNaturalSearch>
                </ListingDetails>
                <ListingDuration>GTC</ListingDuration>
                <ListingType>StoresFixedPrice</ListingType>
                <Quantity>70</Quantity>
                <SellingStatus>
                    <CurrentPrice currencyID="GBP">3.99</CurrentPrice>
                </SellingStatus>
                <ShippingDetails>
                    <ShippingServiceOptions>
                        <ShippingServiceCost currencyID="GBP">0.0</ShippingServiceCost>
                    </ShippingServiceOptions>
                    <ShippingType>Flat</ShippingType>
                </ShippingDetails>
                <TimeLeft>PT15H59M9S</TimeLeft>
                <Title>????????????????????????????</Title>
                <WatchCount>3</WatchCount>
                <QuestionCount>3</QuestionCount>
                <QuantityAvailable>0</QuantityAvailable>
                <SKU>???????</SKU>
                <PictureDetails>
                    <GalleryURL>http://thumbs.ebaystatic.com/pict/???????????_5.jpg</GalleryURL>
                </PictureDetails>
                <NewLeadCount>3</NewLeadCount>
                <ClassifiedAdPayPerLeadFee currencyID="GBP">0.0</ClassifiedAdPayPerLeadFee>
                <SellerProfiles>
                    <SellerShippingProfile>
                        <ShippingProfileID>??????????</ShippingProfileID>
                        <ShippingProfileName>Flat:Royal Mail 2nd(Free),Royal Mail Tra,Same#79</ShippingProfileName>
                    </SellerShippingProfile>
                    <SellerReturnProfile>
                        <ReturnProfileID>????????????</ReturnProfileID>
                        <ReturnProfileName>Returns Accepted,Buyer,30 days#2</ReturnProfileName>
                    </SellerReturnProfile>
                    <SellerPaymentProfile>
                        <PaymentProfileID>124284320022</PaymentProfileID>
                        <PaymentProfileName>PayPal#0</PaymentProfileName>
                    </SellerPaymentProfile>
                </SellerProfiles>
                <HideFromSearch>true</HideFromSearch>
                <ReasonHideFromSearch>OutOfStock</ReasonHideFromSearch>
                <OutOfStockControl>true</OutOfStockControl>
            </Item>

        </ItemArray>
    </ActiveList>
</GetMyeBaySellingResponse>`;

  var document = XmlService.parse(response);
  var root = document.getRootElement();
  var NS = XmlService.getNamespace("urn:ebay:apis:eBLBaseComponents");
  var itms = root.getChild('ActiveList',NS).getChildren();
  for (var i = 0; i < itms.length; i++) {
    var item = itms[i].getChild('BuyItNowPrice',NS).getText();
    Logger.log(item);
  }
}

参考:

已添加:

在最初的问题中,您想要检索BuyItNowPrice的值。在您的新问题中,您想要检索ItemIDTitleListingDetails.ViewItemURLForNaturalSearchPictureDetails.GalleryURL的值。从您最初的问题开始,我没有注意到您的新问题。

在您的脚本中,appendRow用于循环。在这种情况下,处理成本将很高。因此,我建议将这些值放入一个数组并将该数组放到工作表上。

修改后的脚本:

var itms = root.getChild('ActiveList',NS).getChildren();
var values = itms.map(e => {
  var item = e.getChild('ItemID',NS);
  var title = e.getChild('Title',NS);
  var url = e.getChild('ListingDetails',NS).getChild('ViewItemURLForNaturalSearch',NS);
  var imgurl = e.getChild('PictureDetails',NS).getChild('GalleryURL',NS);
  return [item ? item.getText() : "",title ? title.getText() : "",url ? url.getText() : "",imgurl ? imgurl.getText() : ""];
});
sheet.getRange(sheet.getLastRow() + 1,1,values.length,values[0].length).setValues(values);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-