Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何使用idref解析xml元素_Jquery_Xml_Resolve_Idref - Fatal编程技术网

Jquery 如何使用idref解析xml元素

Jquery 如何使用idref解析xml元素,jquery,xml,resolve,idref,Jquery,Xml,Resolve,Idref,给定一些示例data.xml文件: <?xml version="1.0" encoding="utf-8"?> <data> <categories> <category id="google"> <name>Google</name> </category> <categories> <display>

给定一些示例
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>
$.ajax( {
    url: '/data.xml',
    dataType: 'xml',
    success: function( data )
    {
        $data = $( data );
        // fetch categories to display
        $categories = $data.find( 'display > categories > category' );
    }
} );
解决
$categories
中获取的元素通过其
idref
属性所引用的
类别
元素的有效且紧凑的方法是什么

我想出了如下的办法:

$categories.each( function() {
    var $category = $data.find( 'categories > category[id=' + $( this ).attr( 'idref' ) + ']' );
} );
但我认为可能有一种更紧凑的方法来收集元素。

var$data=$(data);
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>
var$byId={}; $(“*[id],$数据)。每个(函数(){ var$this=$(this); $byId[$this.attr(“id”)]=$this; }); //后来。。。 $byId[“谷歌”]。查找(“名称”);//谷歌
您可以从
idref
属性创建:

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

上面的代码使用and来构建一个数组,其中包含所有引用的
元素的唯一实例。

啊,很好,我喜欢你在这里所做的;一次性解析所有
idref
s。我还没有想到要走这条路。@Tomalak,我很确定它能处理所有格式良好的XML文档,是的。我创建了一个简单的测试提琴,id选择器为我工作。这也很好。当然,您也可以简单地创建id选择器。为什么我没有想到这一点?;-)@fireeyedboy这比我的好,如果它更快,还需要测试。从长远来看,可能不会,但根据文件大小的不同,差异可能是微不足道的。@Tomalak:无论如何,在这种情况下,速度对我来说并不是一个真正的问题。但是是的,这有点干净。虽然我喜欢你的一般方法。我现在想做的(只是我刚刚想到的)是将您的两个想法合并到一个扩展jQuery的方法中,这样我就可以执行类似于
$categories.resolvedrefs()
的操作。因此,我认为我不能使用
map()
unique()
。如果我不设法让它起作用,也许我会就此开始一个新问题。到目前为止,谢谢你们两位!