cheeriojs повторяет xml-ответ

#javascript #jquery #xml #cheerio #queryselector

Вопрос:

Допустим, у меня есть xml-ответ на запрос, который выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/xsl/someExcelSheet.xsl"?>
<events>
  <event onair="true">
    <type>Live</type>
    <title>Nyhederne - 1/1</title>
    <airtime>09:30:02.13</airtime>
    <id>58529</id>
  </event>
  <event onair="false">
    <type>PrimaryVideo</type>
    <title>MTV1</title>
    <airtime>09:35:02.13</airtime>
    <id>58532</id>
  </event>
  ...
 

Как я могу использовать cheeriojs его для извлечения данных из него?

Делал

   request(url, (error, response, xml) => {
    if (!error amp;amp; response.statusCode == 200) {
      const $ = cheerio.load(xml, {
        xmlMode: true,
        decodeEntities: true,
        withStartIndices: false,
        withEndIndices: false,
      })
 

и пытаюсь

 > $('events')
LoadedCheerio(1) [Element, options: {…}, _root: LoadedCheerio(1), prevObject: LoadedCheerio(1)]
> $('event')
LoadedCheerio(468) [Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, …]
 

но не мог понять, как с этим работать. Хотел захватить все event в events и повторить это и прочитать текст в <type> <title> тегах и т. Д.

то, что я в итоге сделал, было

 const rows: string[][] = $('event')
  .text()
  .split(/n/)
  .map((str) => str.trim())
  .join('n')
  .split(/n{2,}/g)
  .reduce((acc, str) => [...acc, str.split(/n/)], [])
 

Но должен быть лучший способ, и я надеюсь, что кто-нибудь захочет мне это объяснить?

Ответ №1:

Что-то вроде этого должно помочь вам начать:

 $('event').get().map(event => {
  return {
    type: $(event).find('type').text(),
    title: $(event).find('title').text(),
    // more props
  }
})