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
И это все.
Увидимся