我正在使用一些服务执行跟踪功能。它以XML格式提供响应。为了解析XML响应,我决定使用fast-xml-parser
包。但有一个问题:
当我只得到一个项目作为响应时,它工作得很好,但如果我有多个,比如:
<xsd:events xmlns:xsd="http://somelink/xsd">
<event id=“1234”>
<packetCode>ABC123</packetCode>
<eventCode>EVENT_CODE</eventCode>
<eventDate>2020-12-03T14:34:09.000+02:00</eventDate>
<stateCode>STATUS_CODE</stateCode>
<eventSource zip=“123">Some place</eventSource>
</event>
<event id=“456”>
<packetCode>DEF456</packetCode>
<eventCode>EVENT_CODE</eventCode>
<eventDate>2020-12-03T14:40:44.000+02:00</eventDate>
<stateCode>STATUS_CODE</stateCode>
<eventSource zip=“123">Some place</eventSource>
</event>
</xsd:events>
之后
const xmlParser = require('fast-xml-parser');
xmlParser.parse(exampleXml);
我得到的对象只有最后一个元素:
{
'xsd:events': {
event: {
packetCode: 'DEF456',
eventCode: 'EVENT_CODE',
eventDate: '2020-12-03T14:40:44.000+02:00',
stateCode: 'STATUS_CODE',
eventSource: 'Some place',
}
}
}
但我希望得到这两个事件的数组。如果能让它看起来像:
{
'xsd:events': [{/* event data */}, {{/* event data */}]
}
我做错了什么,也许需要一些选择或其他什么?寻求帮助和建议。
问题是属性有大引号“
而不是"
。
这通常是从Word和MS Office产品复制/粘贴的结果,这些产品有时会将常规引号更改为";聪明的引号"即方向卷曲。这些引号与常规引号不同,通常会导致解析问题,因为它们是多字节字符,如果编码不正确,将被损坏并读取为两个单独的字符。
修复使用常规引号的XML:
<xsd:events xmlns:xsd="http://somelink/xsd">
<event id=“1234”>
<packetCode>ABC123</packetCode>
<eventCode>EVENT_CODE</eventCode>
<eventDate>2020-12-03T14:34:09.000+02:00</eventDate>
<stateCode>STATUS_CODE</stateCode>
<eventSource zip="123">Some place</eventSource>
</event>
<event id=“456”>
<packetCode>DEF456</packetCode>
<eventCode>EVENT_CODE</eventCode>
<eventDate>2020-12-03T14:40:44.000+02:00</eventDate>
<stateCode>STATUS_CODE</stateCode>
<eventSource zip="123">Some place</eventSource>
</event>
</xsd:events>
它将生成预期的JSON,其中包含用于事件的两个对象的数组:
{
"xsd:events": {
"event": [
{
"packetCode": "ABC123",
"eventCode": "EVENT_CODE",
"eventDate": "2020-12-03T14:34:09.000+02:00",
"stateCode": "STATUS_CODE",
"eventSource": "Some place"
},
{
"packetCode": "DEF456",
"eventCode": "EVENT_CODE",
"eventDate": "2020-12-03T14:40:44.000+02:00",
"stateCode": "STATUS_CODE",
"eventSource": "Some place"
}
]
}
}