Как разрешить элемент XML с помощью idref - PullRequest
2 голосов
/ 28 августа 2011

Приведенный образец 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 ]

2 голосов
/ 28 августа 2011

Вы можете создать идентификаторы селектора из атрибутов idref:

var referenced = $.unique($categories.map(function() {
    var $found = $data.find("#" + $(this).attr("idref"));
    return ($found.length ? $found[0] : null);
}).get());

Приведенный выше код использует map () и $.() для создания массива, содержащего уникальные экземпляры всех упомянутых <category> элементов.

1 голос
/ 28 августа 2011
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>
...