Как разрешить элемент XML с помощью idref
Учитывая некоторый образец data.xml
файл:
<?xml version="1.0" encoding="utf-8"?>
<data>
<categories>
<category id="google">
<name>Google</name>
</category>
<categories>
<display>
<categories>
<category idref="google"/>
</categories>
</display>
</data>
И некоторый код JQuery для получения data.xml
файл:
$.ajax( {
url: '/data.xml',
dataType: 'xml',
success: function( data )
{
$data = $( data );
// fetch categories to display
$categories = $data.find( 'display > categories > category' );
}
} );
Что является эффективным и компактным методом для решения category
элементы, к которым извлекаются элементы в $categories
ссылаются на их idref
атрибут?
Я придумал что-то вроде следующего:
$categories.each( function() {
var $category = $data.find( 'categories > category[id=' + $( this ).attr( 'idref' ) + ']' );
} );
Но я подумал, что может быть более компактный способ сбора элементов.
2 ответа
Решение
Вы можете создавать идентификаторы селектора из idref
атрибуты:
var referenced = $.unique($categories.map(function() {
var $found = $data.find("#" + $(this).attr("idref"));
return ($found.length ? $found[0] : null);
}).get());
Приведенный выше код использует map() и $.unique() для создания массива, содержащего уникальные экземпляры всех упомянутых <category>
элементы.
var $data = $( data );
var $byId = {};
$("*[id]", $data).each(function () {
var $this = $(this);
$byId[ $this.attr("id") ] = $this;
});
// later...
$byId["google"].find("name"); // <name>Google</name>