Как поместить указанное содержимое файла XML в массив jquery с помощью ajax?

0

Привет im new для jquery или javascript не уверен, в чем разница.. и im пытается прочитать XML файл и отобразить определенные значения из этого xml в выпадающий список (выберите). Метод ajax im использует чтение xml ok, однако в моем выпадающем списке у меня есть несколько идентичных записей, поэтому мне нужно поместить эти записи в какой-то контейнер и пропустить их, чтобы удалить их. Пока у меня есть

var XML_MAP_PATH = "/resources/XML/MapInformationXML.xml";
var selectedSiteName;
var buildingName;
$(document).ready(function () {

//Clear all drop down lists
$('#cboSiteNames >option').remove();

$('#cboFloors >option').remove();

//Read XML file and populate cboSiteNames drop down list
$.ajax({
    type: "GET",
    crossDomain: true,
    url: XML_MAP_PATH,
    context: document.body,
    dataType: "xml",
    xhrFields: { withCredentials: true },
    success: function (xml) { //If data is available(success) then..
        $(xml).find('Map').each(function () { //go to parent node in xml
            siteName = $(this).attr("Site"); //add all site names to siteName var

            $("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist

        });
    }
});
});

XML

<?xml version="1.0"?>
<MapInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills0.png" />
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills1.png" />
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="2" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills0.png" />
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills1.png" />
  <Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="2" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
  <Map Map_Name="Charfield" Site="Charfield" BuldingName="GES" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\Charfield1.png" />
  <Map Map_Name="Miskin" Site="Miskin" BuldingName="Miskin Building 1" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
  <Map Map_Name="Miskin" Site="Miskin" BuldingName="Miskin Building 2" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\Charfield1.png" />
</MapInformation>
  • 0
    jQuery - это библиотека JavaScript, JavaScript - это язык. jQuery - это полезные функции, написанные на JavaScript, так что вам не нужно, это не язык.
Теги:
arrays

2 ответа

0
Лучший ответ

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

Это гораздо эффективнее, чем создание элементов, а затем цикл и удаление их.

Изменить:

success: function (xml) { //If data is available(success) then..
        $(xml).find('Map').each(function () { //go to parent node in xml
            siteName = $(this).attr("Site"); //add all site names to siteName var

            $("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist

        });
    }

Для того, чтобы:

success: function (xml) { //If data is available(success) then..
        var map = {};
        $(xml).find('Map').each(function () { //go to parent node in xml
            siteName = $(this).attr("Site"); //add all site names to siteName var

            if (!map.hasOwnProperty(siteName)) { // Check if siteName already exists
                map.siteName = true; // Set the siteName property on map to avoid duplicates
                $("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
            }
        });
    }
0

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

 success: function (xml) { //If data is available(success) then..
            var map = [];
            $(xml).find('Map').each(function () { //go to parent node in xml
                siteName = $(this).attr("Site"); //add all site names to siteName var
                if ($.inArray(siteName, map) == -1) {
                    map.push(siteName);
                    $("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
                }
  • 0
    Это гораздо менее эффективно, чем моя версия. Вы повторяете массив каждый раз, чтобы проверить $.inArray() тогда как поиск объекта является O(1) очень быстро, не требует, чтобы вы перебирали все элементы. Почему вы не хотите использовать объект? В объекте вы знаете местоположение, которое нужно искать, в массиве нет необходимости проверять каждый элемент, а затем выполнять дополнительное сравнение строк для каждого элемента, поэтому он гораздо менее эффективен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню