jQuery пересекает XML. Как сделать его динамичным?

#jquery #xml

#jquery #xml

Вопрос:

У меня есть следующий код jQuery, который анализирует XML-файл именно так, как он должен. Под ним вы также можете найти XML-файл, который он анализирует. Как вы можете видеть, корневой узел называется GetArchive, за которым следует другой узел с именем Y2012 .

Y2012 — это узел года, и он может содержать все 12 месяцев года. Каждый месяц может содержать много записей, и каждая запись может содержать много комментариев.

Мой вопрос в том, как я могу изменить свой код, чтобы мне не приходилось его жестко кодировать, как показано ниже? Как я могу сделать так, чтобы мой код проверял, сколько существует узлов year, и анализировал каждый из них, как я делаю ниже?

Большое спасибо за любую помощь.

 $.get('getArchive.xml', null, function (data) {

    // PARSE 2012 JANUARY NODES.

               var ul = $('<ul/>').fadeIn(1000).appendTo('#GetArchive');

       var JanEntries = $(data).find('GetArchive Y2012 Jan Entry').each( function(){

    var JanEntryId    = $(this).find("id").text();    ul.append('<li>'   JanEntryId      '</li>');  
    var JanEntryDate  = $(this).find("date").text();  ul.append('<li>'   JanEntryDate    '</li>');   
    var JanEntryTime  = $(this).find("time").text();  ul.append('<li>'   JanEntryTime    '</li>');  
    var JanEntrytitle = $(this).find("title").text(); ul.append('<li>'   JanEntrytitle   '</li>');  
    var JanEntryBody  = $(this).find("body").text();  ul.append('<li>'   JanEntryBody    '</li>');  

    $(this).find("Comment").each(function () { 
    var CommentId     = $(this).find("cid").text();   ul.append('<li>'   CommentId     '</li>');
    var CommentDate   = $(this).find("cdate").text(); ul.append('<li>'   CommentDate   '</li>');
    var CommentTime   = $(this).find("ctime").text(); ul.append('<li>'   CommentTime   '</li>');
    var CommentFrom   = $(this).find("cfrom").text(); ul.append('<li>'   CommentFrom   '</li>');
    var CommentBody   = $(this).find("cbody").text(); ul.append('<li>'   CommentBody   '</li>');  
    });  

});

    // PARSE 2012 FEBRUARY NODES.

               var ul = $('<ul/>').fadeIn(1000).appendTo('#GetArchive');

       var JanEntries = $(data).find('GetArchive Y2012 Feb Entry').each( function(){

    var FebEntryId    = $(this).find("id").text();    ul.append('<li>'   FebEntryId      '</li>');  
    var FebEntryDate  = $(this).find("date").text();  ul.append('<li>'   FebEntryDate    '</li>');   
    var FebEntryTime  = $(this).find("time").text();  ul.append('<li>'   FebEntryTime    '</li>');  
    var FebEntrytitle = $(this).find("title").text(); ul.append('<li>'   FebEntrytitle   '</li>');  
    var FebEntryBody  = $(this).find("body").text();  ul.append('<li>'   FebEntryBody    '</li>');  

    $(this).find("Comment").each(function () { 
    var CommentId     = $(this).find("cid").text();   ul.append('<li>'   CommentId     '</li>');
    var CommentDate   = $(this).find("cdate").text(); ul.append('<li>'   CommentDate   '</li>');
    var CommentTime   = $(this).find("ctime").text(); ul.append('<li>'   CommentTime   '</li>');
    var CommentFrom   = $(this).find("cfrom").text(); ul.append('<li>'   CommentFrom   '</li>');
    var CommentBody   = $(this).find("cbody").text(); ul.append('<li>'   CommentBody   '</li>');  
    });  

});

    // PARSE 2011 JANUARY NODES.

               var ul = $('<ul/>').fadeIn(1000).appendTo('#GetArchive');

       var JanEntries = $(data).find('GetArchive Y2011 Jan Entry').each( function(){

    var JanEntryId    = $(this).find("id").text();    ul.append('<li>'   JanEntryId      '</li>');  
    var JanEntryDate  = $(this).find("date").text();  ul.append('<li>'   JanEntryDate    '</li>');   
    var JanEntryTime  = $(this).find("time").text();  ul.append('<li>'   JanEntryTime    '</li>');  
    var JanEntrytitle = $(this).find("title").text(); ul.append('<li>'   JanEntrytitle   '</li>');  
    var JanEntryBody  = $(this).find("body").text();  ul.append('<li>'   JanEntryBody    '</li>');  

    $(this).find("Comment").each(function () { 
    var CommentId     = $(this).find("cid").text();   ul.append('<li>'   CommentId     '</li>');
    var CommentDate   = $(this).find("cdate").text(); ul.append('<li>'   CommentDate   '</li>');
    var CommentTime   = $(this).find("ctime").text(); ul.append('<li>'   CommentTime   '</li>');
    var CommentFrom   = $(this).find("cfrom").text(); ul.append('<li>'   CommentFrom   '</li>');
    var CommentBody   = $(this).find("cbody").text(); ul.append('<li>'   CommentBody   '</li>');  
    });  

});

    // PARSE 2011 FEBRUARY NODES.

               var ul = $('<ul/>').fadeIn(1000).appendTo('#GetArchive');

       var JanEntries = $(data).find('GetArchive Y2011 Feb Entry').each( function(){

    var FebEntryId    = $(this).find("id").text();    ul.append('<li>'   FebEntryId      '</li>');  
    var FebEntryDate  = $(this).find("date").text();  ul.append('<li>'   FebEntryDate    '</li>');   
    var FebEntryTime  = $(this).find("time").text();  ul.append('<li>'   FebEntryTime    '</li>');  
    var FebEntrytitle = $(this).find("title").text(); ul.append('<li>'   FebEntrytitle   '</li>');  
    var FebEntryBody  = $(this).find("body").text();  ul.append('<li>'   FebEntryBody    '</li>');  

    $(this).find("Comment").each(function () { 
    var CommentId     = $(this).find("cid").text();   ul.append('<li>'   CommentId     '</li>');
    var CommentDate   = $(this).find("cdate").text(); ul.append('<li>'   CommentDate   '</li>');
    var CommentTime   = $(this).find("ctime").text(); ul.append('<li>'   CommentTime   '</li>');
    var CommentFrom   = $(this).find("cfrom").text(); ul.append('<li>'   CommentFrom   '</li>');
    var CommentBody   = $(this).find("cbody").text(); ul.append('<li>'   CommentBody   '</li>');  
    });  

});    

}, 'xml');
  

И вот XML-файл, который он анализирует.

 <?xml version="1.0" encoding="utf-8"?>
<GetArchive>
  <Y2012>
    <Jan>
      <Entry>
        <id>amp;<bamp;>Jan Entry ID 1amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Jan Comment ID 1</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Jan Comment ID 2</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
      <Entry>
        <id>amp;<bamp;>Jan Entry ID 2amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Jan Comment ID 3</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Jan Comment ID 4</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
    </Jan>
    <Feb>
      <Entry>
        <id>amp;<bamp;>Feb Entry ID 1amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Feb Comment ID 1</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Feb Comment ID 2</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
      <Entry>
        <id>amp;<bamp;>Feb Entry ID 2amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Feb Comment ID 3</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Feb Comment ID 4</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
    </Feb>
  </Y2012>
  <Y2011>
    <Jan>
      <Entry>
        <id>amp;<bamp;>Jan Entry ID 1amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Jan Comment ID 1</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Jan Comment ID 2</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
      <Entry>
        <id>amp;<bamp;>Jan Entry ID 2amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Jan Comment ID 3</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Jan Comment ID 4</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
    </Jan>
    <Feb>
      <Entry>
        <id>amp;<bamp;>Feb Entry ID 1amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Feb Comment ID 1</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Feb Comment ID 2</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
      <Entry>
        <id>amp;<bamp;>Feb Entry ID 2amp;</bamp;></id>
        <date>entry date</date>
        <time>entry time</time>
        <title>entry title</title>
        <body>entry amp;<bamp;>bodyamp;</bamp;>! html friendly</body>
        <Comments>
          <Comment>
            <cid>Feb Comment ID 3</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
          <Comment>
            <cid>Feb Comment ID 4</cid>
            <cdate>comment date</cdate>
            <ctime>comment time</ctime>
            <cfrom>comment from</cfrom>
            <cbody>comment body! text only</cbody>
          </Comment>
        </Comments>
      </Entry>
    </Feb>
  </Y2011>
</GetArchive>
  

Ответ №1:

Я бы с уважением посоветовал вам перестроить XML-документ, если это возможно. <Y2012> должно быть что-то вроде <Year num="2012"> и <Jan> должно быть что-то вроде <Month abbr="Jan" num="1"> . Это не только более согласованно, но и проще программно перебирать:

 $(data).find('Year').each(function() {
    $(this).find('Month').each(function() {
        $(this).find('Entry').each(function() {
            // append id, date, time, title, body
            $(this).find('Comment').each(function() {
                // append comment id, date, time, from, body
            });
        });
    });
});
  

Комментарии:

1. @Vini Я хотел бы упомянуть, что, хотя выбор числа 1 для января является более «человеческим», JavaScript getMonth() ( developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… ) фактически начинает отсчет с нуля. Это важно только в том случае, если вы хотите найти текущий месяц / год в XML-ленте с помощью JS.