【问题标题】:jQuery, parse single xml list into multiple unordered listsjQuery,将单个 xml 列表解析为多个无序列表
【发布时间】:2017-01-29 05:10:05
【问题描述】:

源 XML 如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<area>
    <ticket>
        <ticketnumber>001</ticketnumber>
        <location>Location</location>
    </ticket>
    <ticket>
        <ticketnumber>001</ticketnumber>
        <location>Location</location>
    </ticket>
    <ticket>
        <ticketnumber>001</ticketnumber>
        <location>Location</location>
    </ticket>...
</area>

我可以使用以下代码将其解析为现有的无序列表:

$(document).ready(function(){
    $.ajax({
        type: "GET",
        url: "feed.xml",
        dataType: "xml",
        success: function(xml) {
                $(xml).find('ticket').each(function(){
                    var varTicket = $(this).find('ticketnumber').text();
                    var varLocation = $(this).find('location').text();
                    var varTheHTML = '<li>'+varTicket+' '+varLocation+'</li>';
                    $(varTheHTML).appendTo("#ticket-test");
                });
        },
        error: function() {
            alert("The XML File could not be processed correctly.");
        }
    });

});

这为我提供了预期的填充列表。

<ul id="ticket-test">
    <li>001 Location</li>
    <li>001 Location</li>
    <li>001 Location</li>...
</ul>

当我需要将此列表拆分为多个列表时,问题开始出现,最好嵌套在主列表中。新结构现在是:

<ul id="ticket-test">
    <li>
        <ul>
            <li>001 Location</li>
            <li>001 Location</li>
            <li>001 Location</li>...
        </ul>
    </li>
    <li>
        <ul>
            <li>001 Location</li>
            <li>001 Location</li>
            <li>001 Location</li>...
        </ul>
    </li>...
</ul>

源 XML 本质上是一个平面列表,因此我需要将这些列表项分配到 10 个左右的块中(稍后与 unslider 一起使用)。

我曾尝试在 .each 函数中运行计数器并使用 return false 再次跳出,但代码很快就变成了意大利面条结,我确信有一种更优雅的方式来实现这一点。

我也尝试过 .split 和 for 循环,但总是碰壁。

【问题讨论】:

  • 第二个嵌套的&lt;ul&gt; 是第一个嵌套的&lt;ul&gt; 的副本吗?
  • 不是重复的(抱歉,描述中没有说清楚),第一个嵌套列表是xml中的前10项,第二个列表是列表中的后10项,以此类推.

标签: javascript jquery xml list parsing


【解决方案1】:

你可以这样做

  $(document).ready(function() {
    $.ajax({
      type: "GET",
      url: "feed.xml",
      dataType: "xml",
      success: function(xml) {
        var html = '<li><ul>';
        var counter = 10;
        $(xml).find('ticket').each(function(i, v) {
          var varTicket = $(v).find('ticketnumber').text();
          var varLocation = $(v).find('location').text();
          if (i > 0 && i % counter == 0) {
            html += '</ul></li><li><ul>';
          }
          html += '<li>' + varTicket + ' ' + varLocation + '</li>';



        });
        $(html + '</ul></li>').appendTo("#ticket-test");
      },
      error: function() {
        alert("The XML File could not be processed correctly.");
      }
    });

  });

查看演示:https://jsfiddle.net/y0d1or6h/

【讨论】:

  • 感谢您的回答 :) 代码似乎停在:if(i%10 == 0 ){ html+='&lt;li&gt;&lt;ul&gt;'}
  • 你说的摊位是什么意思?
  • 对不起,我会澄清的。如果我按原样运行,则注释将附加到#ticket-test。如果我删除以下内容,脚本将运行:` if(i%10 == 0 ) { html+='
    • '; } html+= '
    • '+varTicket+' '+varLocation+'
    • '; if(i%10 == 0 ) { html+='
  • '; }`
  • 天才!像魅力一样工作!
  • 也感谢其他回复,遗憾的是我没有时间复习,但我希望他们将来能帮助其他人解决同样的问题。谢谢大家!
  • 【解决方案2】:

    请检查此方法:

    $(document).ready(function() {
      var xmlString =
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<area>' +
        '<ticket>' +
        '<ticketnumber>001</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '<ticket>' +
        '<ticketnumber>002</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '<ticket>' +
        '<ticketnumber>003</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '<ticket>' +
        '<ticketnumber>004</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '<ticket>' +
        '<ticketnumber>005</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '<ticket>' +
        '<ticketnumber>006</ticketnumber>' +
        '<location>Location</location>' +
        '</ticket>' +
        '</area>';
    
      var xmlDoc = jQuery.parseXML(xmlString);
      var tempUL = $('<ul></ul>'); //creating a temp ul tag
      $(xmlDoc).find('ticket').each(function() {
        var varTicket = $(this).find('ticketnumber').text();
        var varLocation = $(this).find('location').text();
        var varTheHTML = '<li>' + varTicket + ' ' + varLocation + '</li>';
        tempUL.append(varTheHTML)
    
      });
      
      //change below number as per your requirement
      var numberOfLi = 3;
      
      while (1) {
    
        var liSet = tempUL.find("li:lt(" + numberOfLi + ")").detach(); //detaching the set of li to make new ul 
        var newUL = $("<ul></ul>").append(liSet);
        var topLI = $("<li></li>").append(newUL);
        topLI.appendTo("#ticket-test");
    
        if (tempUL.find("li").length == 0)
          break;
      }
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    my list
    <ul id="ticket-test"></ul>

    【讨论】:

      【解决方案3】:
      var counter = 2;//change to whatever u need
      var mainHtmlElement = $('#ticket-test');
      var htmlElement;
      
      $('xml').find('ticket').each(function(index){
        if(index % counter == 0) {
          htmlElement = $('<ul class="level_2"></ul>');
          var el_li = $('<li class="level_1"></li>');
          htmlElement.appendTo(el_li);
          el_li.appendTo(mainHtmlElement);
        }
        var varTicket = $(this).find('ticketnumber').text();
        var varLocation = $(this).find('location').text();
        htmlElement.append('<li class="level_2">'+varTicket+' '+varLocation+'</li>');
      });
      

      【讨论】:

        【解决方案4】:

        您可以在 Question 中使用现有模式,然后使用.slice().wrapAll().parent().wrap()、递归。创建两个变量分别定义为010,如果最大变量小于或等于总数#ticket-test li.length,则在函数递归调用中将变量递增10

        var tickets = $("#ticket-test li");
        
        function wrapListItems (el, num, i = 0, n = num) {
          if (n <= tickets.length) {
            el.slice(i, n).wrapAll("<ul>").parent().wrap("<li>");
            i += num;
            n += num;
            wrapListItems(el, num, i, n);
          } 
        };
        
        wrapListItems(tickets, 10);
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
        </script>
        <ul id="ticket-test">
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
          <li>001 Location</li>
        </ul>

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签