使用 xml2js parseString 返回值
Posted
技术标签:
【中文标题】使用 xml2js parseString 返回值【英文标题】:use xml2js parseString return value 【发布时间】:2019-07-28 23:00:01 【问题描述】:xml = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetCurrentRoomStatusGraphResponse xmlns="www.example.com"><GetCurrentRoomStatusGraphResult><RoomStatusGraphItem><RoomID>3</RoomID><ChainID>1</ChainID><RoomNo>8888</RoomNo><RoomTypeID>1</RoomTypeID><RoomTypeCode>DF</RoomTypeCode><RoomTypeName>standard room</RoomTypeName><RoomRate>0.0000</RoomRate><Floor>2</Floor><FolioID>123456</FolioID><Guest><RoomStatusGuest><Name>Jon Snow</Name><Sex>1</Sex><VipTypeID>0</VipTypeID></RoomStatusGuest></Guest><Arrival>2019-03-07T13:43:00</Arrival><Depart>2019-03-08T12:00:00</Depart><IsDepart>false</IsDepart><IsTimeRoom>false</IsTimeRoom><Surreptitious>false</Surreptitious><CheckInState>CheckIn</CheckInState><ClentState>NoClean</ClentState><HouseKeepState>EnableSaleRoom</HouseKeepState><CheckRoomFlag>false</CheckRoomFlag><IsBookInRoom>false</IsBookInRoom><IsFreeRoom>false</IsFreeRoom><IsInnerRoom>true</IsInnerRoom><IsThirdOTA>false</IsThirdOTA><IsAssociationRoom>false</IsAssociationRoom><RoomRemark /><FolioInnerRemark /><FolioRemark /><AddtionalFlag><int>1</int></AddtionalFlag><IsReserve>false</IsReserve><ClearRoomType>3</ClearRoomType><ClearRoomTypeName>normal</ClearRoomTypeName><CheckOutID>0</CheckOutID><CheckOutState>None</CheckOutState><MilkMarketStatus>0</MilkMarketStatus></RoomStatusGraphItem></GetCurrentRoomStatusGraphResult></GetCurrentRoomStatusGraphResponse></soap:Body></soap:Envelope>'
var parseString = require('xml2js').parseString;
parseString(xml, function (err, result)
console.dir(result); //print object user console.log (util.inspect(result, false,null)) can print all value
);
我想要另一个函数使用这个值,如何返回这个值? 像这样
parseString(xml, function (err, result)
return result
);
【问题讨论】:
【参考方案1】:您可以使用 async / await 模式来执行此操作,例如:
const parseString = require('xml2js').parseString;
const xmlInput = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetCurrentRoomStatusGraphResponse xmlns="www.example.com"><GetCurrentRoomStatusGraphResult><RoomStatusGraphItem><RoomID>3</RoomID><ChainID>1</ChainID><RoomNo>8888</RoomNo><RoomTypeID>1</RoomTypeID><RoomTypeCode>DF</RoomTypeCode><RoomTypeName>standard room</RoomTypeName><RoomRate>0.0000</RoomRate><Floor>2</Floor><FolioID>123456</FolioID><Guest><RoomStatusGuest><Name>Jon Snow</Name><Sex>1</Sex><VipTypeID>0</VipTypeID></RoomStatusGuest></Guest><Arrival>2019-03-07T13:43:00</Arrival><Depart>2019-03-08T12:00:00</Depart><IsDepart>false</IsDepart><IsTimeRoom>false</IsTimeRoom><Surreptitious>false</Surreptitious><CheckInState>CheckIn</CheckInState><ClentState>NoClean</ClentState><HouseKeepState>EnableSaleRoom</HouseKeepState><CheckRoomFlag>false</CheckRoomFlag><IsBookInRoom>false</IsBookInRoom><IsFreeRoom>false</IsFreeRoom><IsInnerRoom>true</IsInnerRoom><IsThirdOTA>false</IsThirdOTA><IsAssociationRoom>false</IsAssociationRoom><RoomRemark /><FolioInnerRemark /><FolioRemark /><AddtionalFlag><int>1</int></AddtionalFlag><IsReserve>false</IsReserve><ClearRoomType>3</ClearRoomType><ClearRoomTypeName>normal</ClearRoomTypeName><CheckOutID>0</CheckOutID><CheckOutState>None</CheckOutState><MilkMarketStatus>0</MilkMarketStatus></RoomStatusGraphItem></GetCurrentRoomStatusGraphResult></GetCurrentRoomStatusGraphResponse></soap:Body></soap:Envelope>';
function parseXml(xml)
return new Promise((resolve, reject) =>
parseString(xml, (err, result) =>
if (err)
reject(err);
else
resolve(result);
);
);
function processResult(result)
console.log("processResult: result: ", result);
async function testXmlParse(xml)
try
let result = await parseXml(xml);
// Now that you have the result you can do further processing, write to file etc.
processResult(result);
catch (err)
console.error("parseXml failed: ", err);
testXmlParse(xmlInput);
【讨论】:
【参考方案2】:你可以使用short方法
import parseStringPromise from 'xml2js';
xmlresponse = `<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<QAInformation
xmlns="http://www.qas.com/OnDemand-2011-03">
<StateTransition>SearchResults</StateTransition>
<CreditsUsed>1</CreditsUsed>
</QAInformation>
</soap:Header>
<soap:Body>
<Address
xmlns="http://www.qas.com/OnDemand-2011-03">
<QAAddress DPVStatus="DPVNotConfigured">
<AddressLine LineContent="None">
<Label />
<Line>Commonwealth Bank Building</Line>
</AddressLine>
<AddressLine LineContent="None">
<Label />
<Line>L 10 71-89 Adelaide St</Line>
</AddressLine>
<AddressLine LineContent="None">
<Label />
<Line />
</AddressLine>
<AddressLine>
<Label>Locality</Label>
<Line>BRISBANE CITY</Line>
</AddressLine>
<AddressLine>
<Label>State code</Label>
<Line>QLD</Line>
</AddressLine>
<AddressLine>
<Label>Postcode</Label>
<Line>4000</Line>
</AddressLine>
<AddressLine>
<Label>Country</Label>
<Line>AUSTRALIA</Line>
</AddressLine>
<AddressLine LineContent="Ancillary">
<Label>DPID/DID</Label>
<Line>87902264</Line>
</AddressLine>
</QAAddress>
</Address>
</soap:Body>
</soap:Envelope>`
let convert = await parseStringPromise(xmlresponse);
convert = (JSON.parse(JSON.stringify(convert)));
console.log(convert['soap:Envelope']['soap:Body'][0]['Address'][0]['QAAddress'][0]['AddressLine']);
你会有这样的东西
[
'$': LineContent: 'None' ,
Label: [ '' ],
Line: [ 'Commonwealth Bank Building' ]
,
'$': LineContent: 'None' ,
Label: [ '' ],
Line: [ 'L 10 71-89 Adelaide St' ]
,
'$': LineContent: 'None' , Label: [ '' ], Line: [ '' ] ,
Label: [ 'Locality' ], Line: [ 'BRISBANE CITY' ] ,
Label: [ 'State code' ], Line: [ 'QLD' ] ,
Label: [ 'Postcode' ], Line: [ '4000' ] ,
Label: [ 'Country' ], Line: [ 'AUSTRALIA' ] ,
'$': LineContent: 'Ancillary' ,
Label: [ 'DPID/DID' ],
Line: [ '87902264' ]
]
【讨论】:
以上是关于使用 xml2js parseString 返回值的主要内容,如果未能解决你的问题,请参考以下文章
Promisifying xml2js 解析函数(ES6 Promises)