XML не мой любимый формат обмена данными, но иногда у вас нет выбора. Поэтому, если возникнет вопрос, как обрабатывать эти данные в JavaScript, я сначала хочу использовать существующий модуль npm, который летает в каталоге www. Но на второй взгляд я нашел еще более простое решение, которому не нужно ничего, кроме браузера, который уже есть.

Браузер имеет встроенный синтаксический анализатор, который также может анализировать данные XML. Попробуем его использовать.

Первый шаг к моему контенту — это запрос, который я сделал с помощью fetch.

const result = await fetch(requestUrl)
const xml = await result.text()

Следующим, почти последним, простым шагом был анализ результата.

const domParser = new DOMParser()
const xmlDocument = domParser.parseFromString(xml, 'text/xml')

И вот мы почти у цели. Последний шаг — получить что-то из этих узлов DOM, что можно легко использовать в JavaScript: объект.

index.js

export default from './xml-parser'

xml-parser.js

const api = {
  xmlToJson (xml) {
    let jsonData = {}
    if (xml.nodeType === 1) {
      if (xml.attributes.length > 0) {
        jsonData.attributes = {}
        for (let j = 0; j < xml.attributes.length; j++) {
          const attribute = xml.attributes.item(j)
          jsonData.attributes[attribute.nodeName] = attribute.nodeValue
        }
      }
    }

    const textNodes = [].slice.call(xml.childNodes).filter(node => node.nodeType === 3)
    if (xml.hasChildNodes() && xml.childNodes.length === textNodes.length) {
      jsonData = [].slice.call(xml.childNodes).reduce((text, node) => text + node.nodeValue, '')
    } else if (xml.hasChildNodes()) {
      for (let i = 0; i < xml.childNodes.length; i++) {
        const item = xml.childNodes.item(i)
        const nodeName = item.nodeName.replace(':', '_')
        if (nodeName !== '#text') {
          if (typeof jsonData[nodeName] === 'undefined') {
            jsonData[nodeName] = this.xmlToJson(item)
          } else {
            if (typeof jsonData[nodeName].push === 'undefined') {
              const old = jsonData[nodeName]
              jsonData[nodeName] = []
              jsonData[nodeName].push(old)
            }
            jsonData[nodeName].push(this.xmlToJson(item))
          }
        }
      }
    }
    return jsonData
  },
}

export default api

И это все.

Увидимся