2010-11-24 7 views
3

Я хочу удалить некоторые узлы или добавить некоторые узлы в XML с JQuery, я попробовать его с append, empty, remove, но все они, кажется, не работает, как (в $ .ajax):

success:function(xml){ 
    $(xml).find("layout").append('<app id="' + $children.eq(i).attr("id") + '"></app>'); 
    $(xml).find("layout").empty(); 
} 

Кроме того, я нахожу, что нет учебника по Google. Так что интересно, возможно ли добавлять или удалять узлы в xml с jquery?

ОК, я пишу это в деталях, файл XML просто сохранить в локальном домене в качестве базы данных/UserConfig/config.xml вот мой Ajax код:

function layout_change() 
{ 
    var $children=$input.children(); 

    $.ajax({ 
     type: "get", 
     url: "Database/UserConfig/config.xml", 
     dataType: "xml", 
     timeout: 2000, 
     beforesend:function(xml){ 
      $(xml).find("layout").empty(); 
     }, 
     success:function(xml){ 
      for(var i=0;i<$children.length;i++) 
      { 
       $(xml).find("layout").append('<app id="' + $children.eq(i).attr("id") + '"></app>');    
      } 
     }, 
     error:function(){} 
    }); 
} 

или это может быть сделано с JavaScript или может быть сделано только с языком сервера, как C# ......

вот мой демо XML:?

<layout> 
     <app id="id-4"></app> 
     <app id="id-5"></app> 
     <app id="id-6"></app> 
     <app id="id-1"></app> 
     <app id="id-2"></app> 
     <app id="id-3"></app> 
</layout> 
+1

Если вы можете что-то сделать с javascript, есть большие шансы, что это можно сделать ... с jquery – kobe 2010-11-24 02:23:54

+0

Но вы не должны писать или обновлять файлы xml, текстовые файлы из javascript, это нехороший подход, javascript is в основном для управления DOM, получения данных и отображения ..., отправки данных. – kobe 2010-11-24 02:24:45

ответ

8

jQuery - это фантастический инструмент для анализа и обработки XML в javascript. API-интерфейсы jQuery ajax были, по сути, построены с учетом этого, поэтому вы можете указать тип ответа для ajax-вызова, установив аргумент dataType на xml (хотя они пытаются сделать некоторое автоматическое обнаружение, если этот аргумент опускается). Из $.ajax() документации JQuery для dataType аргумента:

"XML": Возвращает XML-документ, который может быть обработан с помощью JQuery.

Вы можете анализировать и обрабатывать XML столько, сколько хотите, используя jQuery. Я должен добавить, что использование селекторов CSS замечательно по сравнению с запросами XPath в XML-библиотеках на стороне сервера.

Хотя empty и remove работы, как и ожидалось, есть глюк при добавлении узлов на лету с функциями, как append: JQuery, по какой-либо причине (я на самом деле не копал в этом), не будет создавать элемент для вас при добавлении к структуре XML (хотя это хорошо работает в структурах HTML). Вы можете обойти эту проблему легко явно создания узла себя как DOM элемент или объект JQuery и затем вызвать append:

//Either of these will work 
var elem = document.createElement('app'); 
xml.find('layout').append(elem); // Appends <app></app> to <layout> 
xml.find('layout').append($('<app>')); // Does the same 

// You can also you use other manipulation functions such as `attr` 
xml.find('layout').append($('<app>').attr('id', 'ego')); 

Похоже, однако, что существуют и другие проблемы, связанные с вашим кодом, который будет предотвращающей его от поведения, как ожидалось. Например, обратный вызов beforeSend передает в объекте XMLHttpRequest функцию обратного вызова, а не объект XML, который нужно манипулировать. В результате ваш empty вызывается тем, что обратный вызов ничего не делает.

Кроме того, если вы пытаетесь манипулировать ответом Database/UserConfig/config.xml в обратном вызове beforeSend, он, вероятно, еще не существует, так как beforeSend вызывается до запуска запроса ajax. Возможно, что аргумент xml, который вы намеревались передать, был глобальным, но он раздавлен в области обратного вызова, поскольку jQuery проходит в XMLHttpRequest, как я упоминал ранее.

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