在JQuery中解析XML like String

时间:2011-08-16 04:47:26

标签: jquery xml

我正在尝试解析类似XML的String,看起来像这样:

<note>
 <user>Username 1</user>
 <notes>Notes user wrote</notes>
</note>
<note>
 <user>Username 2</user>
 <notes>Notes user wrote</notes>
</note>

我对如何使用JQuery XML解析器感到有点困惑,我想我习惯使用SQL编程来访问数据。

我想要做的是根据用户名打印出笔记

所以在SQL中,它是“SELECT notes FROM FROM WHERE user ='Username 1'”

如何在JQuery XML Parser中进行选择?

编辑我正在尝试的内容:

由于某些原因,这会一直返回Null:

 var xml = '<url>urlofpage1</url><notes>These notes should load!</notes>';
 var $xml = $(xml);

var $notes = $xml.find('url')
                 .filter(function() { return $(this).text() == 'urlofpage1' })
                 .closest('notes');

console.log('$notes: ', $notes.html()); 

2 个答案:

答案 0 :(得分:1)

首先你需要一个jQuery对象:

var xml = '<note><user>Username 1</user><notes>Notes user wrote</notes></note><note><user>Username 2</user><notes>Notes user wrote</notes></note>';
var $xml = $(xml);

然后,您可以使用find:contains selector找到您想要的特定<user>,然后使用closest返回<note>:< / p>

var $notes = $xml.find('user:contains("Username 1")').closest('note');

例如(在控制台打开的情况下运行):http://jsfiddle.net/ambiguous/3Yqqu/

你必须小心:contains选择器,但是:

  

匹配文本可以直接显示在所选元素中,任何元素的后代中,或其组合中。

因此user:contains(一个狭窄的搜索)后跟closest重新开始。如果您正在寻找严格的平等而不是喜欢LIKEish,那么您可能需要添加额外的filtering step

var $notes = $xml.find('user')
                 .filter(function() { return $(this).text() == 'Username 1' })
                 .closest('note');

这是一个例子(控制台请再次打开):http://jsfiddle.net/ambiguous/fYNXx/

这种想法类似于SQL,因为大部分时间你都在使用集合。但是,在shell管道意义上,您经常将事物链接在一起,而不是嵌套查询,子选择和派生表。

答案 1 :(得分:1)

编辑1
mu太短了,答案看起来更干净了,我会选择那个

编辑2
那不太对劲。这有效;你可以看到例子fiddle

function getNotesByUser(xml, username){
    var notes
    $(xml).siblings('note').each(function(){
        if($(this).find('user').text() == username){
            notes = $(this).find('notes');
            return false; //break early
        }
    });
    return notes;
}

var xml = "<note><user>Username 1</user><notes>Notes user wrote</notes></note><note><user>Username 2</user><notes>Notes user2 wrote</notes></note>";

alert(getNotesByUser(xml, "Username 1").text());
alert(getNotesByUser(xml, "Username 2").text());