DataWeave读取XML时参数类型不匹配报错,请求技术解决
DataWeave读取XML报错排查与解决
尝试将XML文件转换为纯文本文件时,DataWeave执行报错。以下是相关输入、脚本及错误信息:
输入XML文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ds:tfmDataService xmlns:nxcm="urn:us:gov:dot:faa:atm:tfm:flightdatacommonmessages" xmlns:fdm="urn:us:gov:dot:faa:atm:tfm:flightdata" xmlns:ns4="urn:us:gov:dot:faa:atm:tfm:ficommondatatypes" xmlns:ds="urn:us:gov:dot:faa:atm:tfm:tfmdataservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns6="http://www.fixm.aero/tfm/3.1" xmlns:ns8="http://www.faa.aero/nas/3.1" xmlns:ns13="urn:us:gov:dot:faa:atm:tfm:rapttimeline" xmlns:ns9="urn:us:gov:dot:faa:atm:tfm:ficommonmessages2" xmlns:ns12="urn:us:gov:dot:faa:atm:tfm:flowinformation" xmlns:ns11="urn:us:gov:dot:faa:atm:tfm:ficommonmessages" xmlns:ns10="urn:us:gov:dot:faa:atm:tfm:tfmrequestreplytypes" xmlns:ns16="http://www.fixm.aero/foundation/3.0" xmlns:ns15="http://www.fixm.aero/flight/3.0" xmlns:ns14="http://www.fixm.aero/base/3.0" xmlns:nxce="urn:us:gov:dot:faa:atm:tfm:tfmdatacoreelements"> <ds:fltdOutput> <fdm:fltdMessage sensitivity="R" cdmPart="true" airline="RPA" major="UAL" sourceFacility="TFMS" sourceTimeStamp="2023-02-27T00:02:36Z" flightRef="28062242" acid="RPA3489" msgType="FlightControl" fdTrigger="TMI_UPDATE" depArpt="CYYZ" arrArpt="KEWR" sensReason="DR"> <fdm:ncsmFlightControl> <nxcm:qualifiedAircraftId userCategory="COMMERCIAL" aircraftCategory="JET"> <nxce:aircraftId>RPA3489</nxce:aircraftId> <nxce:computerId> <nxce:facilityIdentifier>TFMS</nxce:facilityIdentifier> <nxce:idNumber>555</nxce:idNumber> </nxce:computerId> <nxce:gufi>KC81743100</nxce:gufi> <nxce:igtd>2023-02-26T23:30:00Z</nxce:igtd> <nxce:departurePoint> <nxce:airport>CYYZ</nxce:airport> </nxce:departurePoint> <nxce:arrivalPoint> <nxce:airport>KEWR</nxce:airport> </nxce:arrivalPoint> </nxcm:qualifiedAircraftId> <nxcm:etd timeValue="2023-02-27T00:11:00Z" etdType="PROPOSED" /> <nxcm:eta timeValue="2023-02-27T00:36:00Z" etaType="ESTIMATED" /> <nxcm:controlIndicator>CONTROL_ACTIVE</nxcm:controlIndicator> <nxcm:ncsmControlData> <nxcm:ctd>2023-02-27T00:11:00Z</nxcm:ctd> <nxcm:cta>2023-02-27T00:36:00Z</nxcm:cta> <nxcm:octd>2023-02-27T00:14:00Z</nxcm:octd> <nxcm:octa>2023-02-27T01:18:00Z</nxcm:octa> <nxcm:controlElement>EWR</nxcm:controlElement> <nxcm:controlProgramType>GDP</nxcm:controlProgramType> </nxcm:ncsmControlData> </fdm:ncsmFlightControl> </fdm:fltdMessage> </ds:fltdOutput> </ds:tfmDataService>
DataWeave脚本
%dw 2.0 import * from dw::core::Strings var myInput = read(payload, 'application/xml') output text/plain --- "abc"
报错信息
You called the function 'AnonymousFunction' with these arguments: 1: Object (do {ns ds urn:us:gov:dot:faa:atm:tfm:tfmdataservice---{ds#tfmDataService: {ds...) 2: String ("application/xml") But it expects arguments of these types: 1: String | Binary 2: String 3: Object 3| var myInput = read(payload, 'application/xml') ^^^^ Trace: at main::main (line: 3, column: 15)
问题原因与解决方法
原因
read()函数要求第一个参数必须是String或Binary类型,但当前的payload已经被Mule Runtime自动解析为XML对象(结构化的Object类型),因此传入read()会触发类型不匹配的错误。
解决方法
不需要手动调用read()函数,直接使用已解析好的payload即可。根据需求可以选择两种处理方式:
1. 提取XML字段生成自定义纯文本
直接从解析后的payload中提取需要的字段,拼接成目标格式:
%dw 2.0 output text/plain --- "航班信息: 航班号: " ++ payload.ds#tfmDataService.ds#fltdOutput.fdm#fltdMessage.@acid ++ " 起飞机场: " ++ payload.ds#tfmDataService.ds#fltdOutput.fdm#fltdMessage.@depArpt ++ " 到达机场: " ++ payload.ds#tfmDataService.ds#fltdOutput.fdm#fltdMessage.@arrArpt ++ " 预计起飞时间: " ++ payload.ds#tfmDataService.ds#fltdOutput.fdm#fltdMessage.fdm#ncsmFlightControl.nxcm#etd.@timeValue ++ " 预计到达时间: " ++ payload.ds#tfmDataService.ds#fltdOutput.fdm#fltdMessage.fdm#ncsmFlightControl.nxcm#eta.@timeValue
2. 输出原始XML文本
如果需要直接输出原始XML内容,可使用write()函数将解析后的对象转回XML格式:
%dw 2.0 output text/plain --- write(payload, "application/xml")
内容的提问来源于stack exchange,提问作者aditya parkhe
相关产品推荐
相关产品推荐

