fast-xml-parse возвращает только один объект вместо массива в Nodejs
Я выполняю функцию отслеживания с помощью какой-то службы. Он предоставляет ответ в формате XML. Для анализа ответа XML я решил использовать
fast-xml-parser
пакет. Но существует проблема:
Когда я получаю в ответ только один элемент, он работает хорошо, но если у меня их несколько, например:
<xsd:events xmlns:xsd="http://epevents.post.ee/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 */}]
}
Что я делаю не так, возможно, нужны какие-то опции или что-то еще? Нужна помощь и советы.
1 ответ
Проблема в том, что атрибуты имеют фигурные кавычки.
“
вместо
"
.
Это часто является результатом копирования / вставки из продуктов Word и MS Office, которые иногда меняют обычные кавычки на "умные кавычки", которые являются направленными фигурными. Это не то же самое, что обычные кавычки, и часто вызывают проблемы с синтаксическим анализом, поскольку они являются многобайтовыми символами и, если они не закодированы должным образом, будут искажены и прочитаны как два отдельных символа.
Исправьте XML, чтобы использовать обычные кавычки:
<xsd:events xmlns:xsd="http://epevents.post.ee/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"
}
]
}
}