Node.js用soap调用Fedex接口上传多页PDF报XML格式错误
嘿,这个问题我之前帮别人排查过类似的,核心原因很明确:你的多页PDF转成Base64后,字符串里包含了XML的特殊字符(比如&、<、>这类),而你没对这些字符做处理,直接塞进XML请求里,导致Fedex的XML解析器读的时候,把这些特殊字符当成了XML标签的一部分,误以为遇到了提前结束的标签,所以抛出了"Unexpected close tag"错误。
单页PDF的Base64内容短,刚好没撞上这些特殊字符,所以流程正常;多页PDF内容长,概率性出现了这类字符,就触发了XML结构崩溃的问题。
解决办法有两种,选一种就行:
用CDATA包裹Base64内容
XML里的CDATA块会告诉解析器:“这里面的内容是纯文本,别当成XML标签解析”。你只需要把<ns:DocumentContent>里的Base64字符串放在<![CDATA[ ]]>里面就行。比如:<ns:DocumentContent><![CDATA[你的多页PDF Base64字符串]]></ns:DocumentContent>用
soap包的话,构造请求参数的时候直接给DocumentContent加上CDATA包裹:const uploadRequest = { // 其他必填参数(WebAuthenticationDetail、ClientDetail这些)... Documents: { CustomerReference: "", DocumentType: "PRO_FORMA_INVOICE", FileName: "1810e200-4467-11e8-b6a8-07a18eeb7b1a.pdf-test.pdf", DocumentContent: `<![CDATA[${yourMultiPagePdfBase64}]]>` } };对Base64做XML实体转义
把Base64里的特殊字符替换成XML能识别的实体:&→&<→<>→>"→"'→'
你可以手动写个简单的替换函数,或者用xml-escape这类npm包来处理,转义完再塞进请求里。
验证小技巧
修改完之后,先把生成的XML请求打印出来,检查<ns:DocumentContent>部分的内容是不是已经正确处理了特殊字符,再发给Fedex测试,应该就能解决这个XML解析错误啦。
内容的提问来源于stack exchange,提问作者Pratiti Das
相关产品推荐
相关产品推荐

