#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.