2011-08-28 30 views
2

解析XML元素鉴于一些样本data.xml文件:如何使用IDREF

<?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'); 
    } 
}); 

什么是解决一个高效紧凑的方法$categories中提取的元素所参照的category元素是否由它们的idref属性引用?

我拿出像下面这样:

$categories.each(function() { 
    var $category = $data.find('categories > category[id=' + $(this).attr('idref') + ']'); 
}); 

但我认为有可能是收集元素的更紧凑的方式。

回答

2

可以创建从idref属性id selectors

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

上面的代码使用和map()$.unique()建立包含所有被引用的<category>元件的独特实例的数组。

+0

这是否适用于任意XML文档? – Tomalak

+0

@Tomalak,我确定它可以与所有格式良好的XML文档一起工作,是的。我创建了一个简单的测试小提琴[here](http://jsfiddle.net/fhamidi/f7v2J/),id选择器适用于我。 –

+0

这也很好。当然,你也可以简单地创建id选择器。为什么我没有想到这个? ;-) –

1
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> 
+0

好啊,我喜欢你在这里做的;一次解决所有'idref's。我还没有想到要走这条路。 –