2013-08-27 4 views
0

Я пытаюсь вернуть родительский элемент при поиске дочернего элемента, а затем отобразить текст параллельного дочернего элемента.jQuery XML Parsing - Возвращает родительские элементы ребенка

XML:

<store> 
    <shelf> 
     <book> 
      <name>Book_1</name> 
      <id>1</id> 
     </book> 
     <book> 
      <name>Book_2</name> 
      <id>2</id> 
     </book> 
     <book> 
      <name>Book_1</name> 
      <id>3</id> 
     </book> 
    </shelf> 
</store> 

JQuery:

$(document).ready(function(){ 
    $.ajax({ 
     type: "GET", 
     url: "xml_file.xml", 
     dataType: "xml", 
     success: parseXml 
    }); 
}); 

function parseXml(xml){ 

    var books = $(xml).find('name').filter(function() { 
     return $(this).text() === 'Book_1'; 
    }).parent(); 

    for(i=0; i<books.length; i++){ 
     $('#results').text(
      (books[i]).find('id').text() 
     ); 
    } 
} 

HTML:

<div id="results"></div> 

Так в основном, если я искать "имя" с этим есть текст "книги", Я хочу вернуть 2 книги. Затем я хочу отобразить каждую книгу в div с id = "results". Любая помощь будет оценена по достоинству. Благодаря!

+0

Вы можете разместить XML-где некоторые или дать URL пробы XML для использования ... –

ответ

0

Ваш XML является недействительным, вы упускаете корневой узел, и </aid> должен быть </id> как

<shelf> 
    <book> 
     <name>Book_1</name> 
     <id>1</id> 
    </book> 
    <book> 
     <name>Book_2</name> 
     <id>2</id> 
    </book> 
    <book> 
     <name>Book_1</name> 
     <id>3</id> 
    </book> 
</shelf> 

Также вы пропали без вести в praseXml в $ и используя .text над запишет все предыдущие значения

function parseXml(xml){ 

    var books = $(xml).find('name').filter(function() { 
     return $(this).text() === 'Book_1'; 
    }).parent(); 

    for(i=0; i<books.length; i++){ 
     $('#results').append(
      $(books[i]).find('id').text() 
     ); 
    } 
} 

http://jsfiddle.net/uq9cW/

+0

Я обновил пример XML в исходном вопросе. Это отлично поработало, спасибо! –

0

Настройка вашего XML в локальную переменную для Brev ность.

var $xml = $("<books><book><name>Book_1</name><id>1</aid></book><book><name>Book_2</name><id>2</aid></book><book> <name>Book_1</name><id>3</aid></book></books>") 

var searchString = "Book_1"; 
var matchedBooks = $xml 
    .children('book') /* Get all the books */ 
    .children('name') /* And then the names. You could just get the names first, but this will allow you to exclude nodes not inside of a book element */ 
    .filter(function(i,v){ return $(v).text() == searchString; }) /* This excludes non matching names. */ 
    .parent('book'); /* Now we have 2 matching elements, on each, get the parent element */ 

/* Build the html then append to save DOM interaction speed tax */ 
var resultHtml = ""; 
$(matchedBooks).each(function(i, e){ 
    resultHtml += "<p>" + $(e).find('id').text() + "</p>"; 
}); 
$("#results").html(resultHtml); 

Позвольте мне знать, если это отвечает на ваш вопрос

Смежные вопросы