XML DOM Parser, проблема с двумерным массивом

  • Автор темы Aleks031
  • 45
  • Обновлено
  • 15, May 2024
  • #1
Привет ребята,

Я хотел бы поместить XML-данные в массив 2dim, но не выполнил свою работу. Все в порядке с обещанием, что циклы работают нормально, но я не получаю второе измерение массива.

(Так что я здесь довольно одномерен). Если с.б. хотелось бы взглянуть на код.

Большое спасибо!
  (function(d) {

let output = d.getElementById('output');

getCurrentDate();

d.addEventListener('DOMContentLoaded',()=> {

//fetch data as soon as the page has loaded

const proxyurl = "[URL='https://lumtu.com/yti/bvNNvbS9odHRwczovL2NvcnMtYW55d2hlcmUuaGVyb2t1YXBwLmwBX']https://cors-anywhere.herokuapp.com/[/URL]";

let url = "[URL='https://lumtu.com/yti/NwMMwNjVodHRwOi8veG1sdHYuY28udWsvZmVlZC83CZl']http://www.xmltv.co.uk/feed/7365[/URL]";

fetch(proxyurl+url)

.then(response => response.text())

.then(data => {

//console.log(data); //string

let parser = new DOMParser();

let xml = parser.parseFromString(data,"application/xml");

//output.textContent = data;

console.log(xml);

channelList(xml);

//channelIdList(xml);

});

});

function channelList(xml) {

let tableFields = [[]];

let list = d.getElementById('channelPrg');

let channelName = xml.getElementsByTagName('display-name');

// let channelId = xml.getElementsByTagName('channel'); //for channel ID

// let programm = xml.getElementsByTagName('programme'); //for channel ID

let title = xml.getElementsByTagName('title');

for(let i=0; i < channelName.length; i++) {

tableFields[i] = channelName[i].firstChild.nodeValue;

for(let j=0; j < title.length; j++) {

if (channelName[i].parentNode.getAttribute("id") === title[j].parentNode.getAttribute("channel") ) {

tableFields[i][j] = title[j].firstChild.nodeValue;

}

}

}

console.log(tableFields);

}

})(document);
Код (JavaScript):

Aleks031


Рег
23 Aug, 2015

Тем
1

Постов
3

Баллов
13
  • 18, May 2024
  • #2
У меня такое ощущение, что вы слишком обдумываете это и используете циклы «for», когда вам нужно пройти по DOM.

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

Когда исходные данные мусорные, с ними, конечно, тяжело работать. Вместо массива я бы предложил использовать объект или карту, где идентификаторы каналов являются вашими ключами.

Или, что еще лучше, используйте cloneNode для создания нового фрагмента DOM, поскольку перемещение по DOM происходит быстрее, чем по массивам, и дает вам данные в нужном вам формате. Точно так же я бы предложил избавиться от всех новомодных обещаний и всякой чепухи let/const.

Во-первых, это плохая идея из-за устаревшей поддержки (или ее отсутствия), если это клиентский код, во-вторых, это ДЕЙСТВИТЕЛЬНО не приносит вам никакой пользы, когда дело доходит до обработки ошибок.

тем более вы находитесь в совершенно хорошем IIFE и ни одна из ваших функций не является достаточно длинной, вам даже следует беспокоиться об объеме.

Это все просто бессмысленная путаница и раздувание кода, сколько бы «экспертов» ни ломали трусы над этими «фичами». И да, это «воздушные кавычки», поскольку, когда я говорю «эксперты» и «особенности», я делаю это с крайним сарказмом! XMLHttpRequest был бы даже лучше, потому что «из коробки», если вы не переопределите его, он попытается автоматически создать для вас XMLDom.

На самом деле это то, для чего он был разработан, отсюда и XML в его названии! Эта чушь типа «выбрать/затем» — это некомпетентная искалеченная чушь, особенно при работе с XML, в любом случае объем кода один и тот же. (см. XMLHttpRequest.responseXML)

Вероятно, вам также следует экранировать свой URI на прокси-сервере, чтобы не использовать недопустимые URI.

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

Я думаю, что более важный вопрос: что вы пытаетесь сделать с этим массивом? Какова конечная цель? Если бы вы могли сделать это прямо в XMLDomFragment, а не возиться с массивами, сделайте это.
 

василий трошин


Рег
27 Apr, 2012

Тем
0

Постов
3

Баллов
3
  • 03, Jun 2024
  • #3
Да, у меня в голове не укладывается этот массив: Я изменил первый цикл следующим образом:
  for(let i=0; i < channelName.length; i++) {

tableFields[i] = channelName[i].firstChild.nodeValue;

tableFields[i] = [];

/// sendond loop {}

}
Код (JavaScript): Затем я получил вот это: (на этот раз только записи второго цикла, но не первого):
 

Greenland


Рег
06 May, 2014

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966

Интересно