\r\n\r\n\r\n```\r\n\r\n\r\n```JavaScript\r\n\r\n\r\n```\r\n```php\r\n\r\n\r\n\r\n$(document).ready(function(){\r\nvar rssURL=\"https://book.studio947.net/feed/\"\r\n$.ajax({url: 'cdxml.php',type: 'GET',dataType: 'xml',data: {url: rssURL} })\r\n\r\n.done(function(data){\r\n$(data).find('item').each(function(i){\r\nvar titRSS=$(this).find('title').text();\r\nvar likRSS=$(this).find('link').text();\r\n\r\nvar ItemRSS=$(this).find('item').text();\r\n\r\nvar dteRSS=$(this).find('pubDate').text();\r\nvar DateOj=new Date(dteRSS) \r\n\r\nvar dateDg=DateOj.getDate()\r\n\r\naddZero=function(num,digit){\r\nvar numString=String(num);\r\nwhile(numString.length') \r\n\r\n.append($('').attr('href',likRSS).text(titRSS))\r\n.append(DateAp)\r\n)\r\n\r\n// スコープ外に出すためにいったんグローバル変数に置き換える\r\nk=i\r\n\r\n});//each\r\n\r\nconsole.log(k+1+'個');\r\n}) //done\r\n\r\n.fail(function(){window.alert('読み込みエラー');\r\n}) //fail\r\n}); //ready\r\n\r\n\r\n\r\n\r\n```","dateModified":"2019-06-13T15:26:55.825Z","datePublished":"2019-06-13T15:26:55.825Z","upvoteCount":0,"url":"https://teratail.com/questions/186792#reply-289000"},"suggestedAnswer":[{"@type":"Answer","text":"> ※オブジェクト:ページ上に出力する記事の数\r\n=xmlファイルからダウンロードした「title」タグの個数\r\n\r\nRSS自体のtitleがあるのでイコールではありません。\r\nitemの数を数えましょう。","dateModified":"2019-04-28T04:17:01.181Z","datePublished":"2019-04-28T04:17:01.181Z","upvoteCount":2,"url":"https://teratail.com/questions/186792#reply-277603","comment":[{"@type":"Comment","text":"回答して頂きありがとうございます。\r\n\r\n>RSS自体のtitleがあるのでイコールではありません。\r\nitemの数を数えましょう。\r\n↓\r\n確認してみましたが、今回の場合RSS自体にtitleタグはないと思いますよ。\r\nRSSの配信先はガイドブックにある学習用のものですから。\r\n\r\nそれはともかく「itemの数を数えましょう。」というのは、\r\n同じ方法で配列型の変数に代入してみなさい。\r\nという意味だと思います。\r\n\r\nアドバイス通りやってみましたが\r\nやはり結果は同じでitemタグの場合でも「0」になります。\r\n\r\nもしかしたら、こちらの知識不足で\r\nアドバイスして頂いたこの意味を把握していなかったらすいません。\r\n\r\n------\r\n\r\nitemタグやtitleタグの数を数えるためには\r\n一度、変数に代入する必要があると思うのですが、\r\n変数は配列型で良いのでしょうか?\r\n\r\nこちらの知識不足のせいて、アドバイスして頂いたことがよくわからない場合があります。\r\nそのためYes-Noで答えて頂けるように書き換えてみました。\r\nとりあえず、先に以下のことだけ教えて頂ければうれしいです。\r\n\r\nitemタグやtitleタグの数を数えるためには\r\n1)一度、変数に代入する必要がある?\r\nYes / No \r\n\r\n1-Yes)\r\n変数の型は宣言は何型で行いますか?\r\n※今回のコードで使える書式で記載して下さい\r\nvar = \r\n\r\n1-No)\r\n変数に代入して「length」プロパティで取得する\r\n以外の方法でがあるのでしたら教えて下さい。\r\n\r\n※こちらの知識不足で理解できないかもしれません。\r\nストレスのない範囲で大丈夫です。\r\n\r\nよろしくお願いします。","datePublished":"2019-04-28T05:11:50.404Z","dateModified":"2019-04-28T05:11:50.404Z"},{"@type":"Comment","text":"> RSSの配信先はガイドブックにある学習用のものですから。\r\nhttps://book.studio947.net/feed/\r\nこれではないのでしょうか。\r\n\r\n> 同じ方法で配列型の変数に代入してみなさい。\r\n違います。\r\n「jQuery 要素 数」で検索。","datePublished":"2019-04-28T05:31:41.024Z","dateModified":"2019-04-28T05:31:41.024Z"},{"@type":"Comment","text":"早速の回答ありがとうございます。\r\n\r\nこれから「「jQuery 要素 数」で検索」で調べます\r\n\r\nそれは良いのですが、すいませんが\r\nitemタグやtitleタグの数を数えるためには\r\n\r\n1)一度、変数に代入する必要がある?\r\nYes / No \r\n\r\nも教えて下さい。\r\n\r\nとにかく知識不足なので、調べるのは良いのですが\r\nクリアできることから\r\n1つづつクリアして行きたいと思っていますので。","datePublished":"2019-04-28T05:40:43.746Z","dateModified":"2019-04-28T05:40:43.746Z"},{"@type":"Comment","text":"> も教えて下さい。\r\n「違います。」と書いていますよ。\r\n\r\n> 1つづつクリアして行きたいと思っていますので。 \r\nそれなら、入門書を最初から読むことをお勧めします。\r\nたとえば「文字列型で宣言」と書かれていますが、そういう書き方はありません。配列のほうも変数を宣言して空配列を初期値に指定しているだけです。また、それに続くconsole.log();の使い方も変です。空の配列を用意して要素数が0な事を確認して、何の値が出ると思ったのでしょう。\r\n\r\nその段階で非同期処理を含むコードを書くのは気が早いと思います。","datePublished":"2019-04-28T05:53:27.632Z","dateModified":"2019-04-28T05:53:27.632Z"},{"@type":"Comment","text":"回答して頂きありがとうございます\r\n\r\n> も教えて下さい。\r\n「違います。」と書いていますよ。\r\n↓\r\nすいません。\r\n要するに、「No」ということで変数に代入しなくても良いということですね。\r\nこれだけわかったので、とりあえず納得です。\r\n\r\n>配列のほうも変数を宣言して空配列を初期値に指定しているだけです。\r\n↓\r\nそういうことなのですね。わかりました、初期値に指定するとスコープ内での処理が\r\n配列型で入るのだと思っていました。\r\n\r\n>それに続くconsole.log();の使い方も変です。空の配列を用意して要素数が0な事を確認して、何の値が出ると思ったのでしょう。\r\n↓\r\n違います。\r\n\r\n「console.log(); //スペース用」と記載したので\r\nわかって頂けると思っていましたが書き方が悪かったですね。\r\n\r\nブラウザーのコンソールに出力された時に\r\n結果ばかりが縦にたくさん並ぶと見にくいので、\r\n見やすいように1行開けるために空出力しています。\r\n\r\n今、頑張ってます。\r\nいろいろありがとうございます。","datePublished":"2019-04-28T06:06:51.535Z","dateModified":"2019-04-28T06:06:51.535Z"},{"@type":"Comment","text":"> 見やすいように1行開けるために空出力しています。\r\nそこではなく、結果に対しての「配列型で変数の宣言をすることが間違っているのだと思います。 」という結論自体がおかしいです。\r\n再掲:「空の配列を用意して要素数が0な事を確認して、何の値が出ると思ったのでしょう。」\r\nここで言う「空の配列」は「GlbtitNo」です。それのlengthは何も入っていないのだから0です。何も入れていないのだから当然そうなりますが、何が出ると思ったのでしょう、と書いています。","datePublished":"2019-04-28T06:52:29.061Z","dateModified":"2019-04-28T06:52:29.061Z"},{"@type":"Comment","text":"回答して頂きありがとうございます。\r\n\r\n>再掲:「空の配列を用意して要素数が0な事を確認して、何の値が出ると思ったのでしょう。」\r\nここで言う「空の配列」は「GlbtitNo」です。それのlengthは何も入っていないのだから0です。何も入れていないのだから当然そうなりますが、何が出ると思ったのでしょう、と書いています。\r\n↓\r\n今回のコードの中の「3番」のことですね。\r\n\r\nエラーメッセージが表示されたら\r\nメッセージを確認するつもりでしたが、\r\n「0」でもエラーにならないし、\r\nまぎらわしいので消しておいた方が良かったですね。\r\n\r\nいずれにしても、何度もコメントして頂いたことの意味は理解しました。\r\n\r\n変数に代入せずともjQueryで要素の数を数えれば良いだけ、、、。\r\nということだと思います。\r\n\r\n今の私の実力で、今すぐなんとかなる範囲ではないので、\r\n今回はここで区切っておきます。\r\n※質問は開けておきます。自分なりに後でまとめたいので。\r\n\r\n何度もコメントして頂きありがとうございます。\r\n私の知識不足で解決しませんでしたが、いろいろ参考になりました。\r\n機会がありましたら、またお願いします。","datePublished":"2019-04-28T07:32:29.276Z","dateModified":"2019-04-28T07:32:29.276Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"JavaScriptに関する質問","url":"https://teratail.com/tags/JavaScript"},{"@type":"ListItem","position":3,"name":"JavaScript","url":"https://teratail.com/tags/JavaScript"}]}}}パソコンスクールでJavaScriptを勉強しています。
配信されているRSSのXMLファイルをダウンロードして
ページ上に出力するという課題の勉強をしています。
※サンプルのコードは以下の通りです。
ajaxについて、月を英字で表示する、日を2桁表示する
(2桁表示 = 1→01)、etc.いろいろ学びました。
その中で今度は
ダウンロードしたXMLファイルの中にオブジェクトが何個あるのか求める
という課題になりました。
※オブジェクト:ページ上に出力する記事の数
=xmlファイルからダウンロードした「title」タグの個数
私の考えでは以下のコードの「1番」でtitleタグの数を取得して
コンソールに出力できると思っていました。
ですが画像の通り「1番」のコンソールへの出力結果は「0」になります。
「3番」の結果が「[]」になることも含めて
配列型で変数の宣言をすることが間違っているのだと思います。
すいませんが正しい変数の宣言を含め、
以下のサンプルコードで記事の数(ダウンロードしたtitleタグ)を
取得する方法を教えて下さい。
※取得した結果の出力先はコンソールでOKです。
追記
コンソールへの出力は「5番」までありますが、
「2番」、「4番」、「5番」は動作確認のため出力してみただけです。
今回の処理とは無関係です。
お手数ですが、詳しい方、説明の上手な方
よろしくお願いします。
Html
1<br>
2<p>titlId</p>
3
4<ul id="titlId" style="padding: 0px 10px;"></ul>
5
6<br>
7<br>
8
9<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
10
11
JavaScript
1<script>
2//配列型で宣言
3var GlbtitNo = [];
4
5//文字列型で宣言
6var GlbtitSt = String;
7
8//1番 配列型
9console.log(GlbtitNo.length);
10
11//2番 文字列型
12console.log(GlbtitSt.length);
13console.log(); //スペース用
14
15//3番 配列型
16console.log(GlbtitNo);
17
18//4番 文字列型
19console.log(GlbtitSt);
20
21//スペース用
22console.log('');
23
24$(document).ready(function() {
25 var rssURL = "https://book.studio947.net/feed/"
26 $.ajax({
27 url: 'cdxml.php',
28 type: 'GET',
29 dataType: 'xml',
30 data: {
31 url: rssURL
32 }
33 })
34
35 .done(function(data) {
36 $(data).find('item').each(function() {
37 var titRSS = $(this).find('title').text();
38 var likRSS = $(this).find('link').text();
39
40 //グローバル変数用
41 GlbtitNo = titRSS;
42 GlbtitSt = titRSS;
43
44 //5番 文字数
45 console.log(titRSS.length);
46
47 var dteRSS = $(this).find('pubDate').text();
48 var DateOj = new Date(dteRSS)
49
50 var dateDg = DateOj.getDate()
51
52 addZero = function(num, digit) {
53 var numString = String(num);
54 while (numString.length < digit) {
55 numString = '0' + numString;
56 }
57 return numString;
58 }
59
60 var montEg = ['Jan', 'Feb', 'Mar', 'Apl', 'May', 'Jun', 'Jul', 'Aug',
61 'Sep.', 'Oct', 'Nov', 'Dec'
62 ]
63
64 var DateAp = ' ' + DateOj.getFullYear() + '/' + montEg[DateOj.getMonth()] +
65 '/' + addZero(dateDg, 2);
66
67 $('#titlId')
68 .append($('<li></li>')
69
70 .append($('<a target="_blank"></a>').attr('href', likRSS).text(
71 titRSS))
72 .append(DateAp)
73 )
74
75 }); //each
76 }) //done
77
78 .fail(function() {
79 window.alert('読み込みエラー');
80 }) //fail
81}); //ready
82</script>
83
php
1<?php
2if(isset($_GET["url"]) && preg_match("/^https?:/",$_GET["url"])){
3 $ch = curl_init($_GET["url"]);
4 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
5 curl_setopt($ch, CURLOPT_TIMEOUT, 60);
6 $data = curl_exec($ch);
7 curl_close($ch);
8 echo $data;
9}else{
10 echo "ERROR!";
11}
ブラウザーの画面
※文字数は記事の個数分=10個出力されています。画面は2個の所で切り取っています。

※オブジェクト:ページ上に出力する記事の数
=xmlファイルからダウンロードした「title」タグの個数
RSS自体のtitleがあるのでイコールではありません。
itemの数を数えましょう。
自己解決
自己解決してます。アップするのを忘れておりすいません。
こちら教えて頂いたアドバイスでは「item」の数を数えなさいということでしたが、
抽象的なアドバイスで、私の知識では解答の意味がわかりませんでした。
パソコンスクールの課題だったので、先生からの回答は以下の通りです。
「title」タグを取得して、ページ上に出力している
=「繰り返し処理をしている」、「nodelistを取得している」ということなので、
「nodelistの番号を取得してコンソールに出力する」というのが、
先生からの回答でした。
関数内でのnodelistの番号を取得する方法は関数の第1引数を取得すれば良いのですが、
ポイントが2つあり以下の通りです
1)nodelistの番号は「0」から始まるので、最後に「+1」する
2)取得した番号は関数のスコープの中でしか使えないのでグローバル変数に変換する
ということでした。コードは以下の通りです。
※JavaScript/jQueryだけです。 phpの変更は不要です。
※HTMLのコードは前述のコードと同じです=jQueryへのリンクが必要です
JavaScript
1<script>
2
3
4$(document).ready(function(){
5var rssURL="https://book.studio947.net/feed/"
6$.ajax({url: 'cdxml.php',type: 'GET',dataType: 'xml',data: {url: rssURL} })
7
8.done(function(data){
9$(data).find('item').each(function(i){
10var titRSS=$(this).find('title').text();
11var likRSS=$(this).find('link').text();
12
13var ItemRSS=$(this).find('item').text();
14
15var dteRSS=$(this).find('pubDate').text();
16var DateOj=new Date(dteRSS)
17
18var dateDg=DateOj.getDate()
19
20addZero=function(num,digit){
21var numString=String(num);
22while(numString.length<digit){
23numString='0'+numString;
24}
25return numString;
26}
27
28var montEg=['Jan','Feb','Mar','Apl','May','Jun','Jul','Aug','Sep.','Oct','Nov','Dec']
29
30var DateAp=' '+DateOj.getFullYear()+'/'+montEg[DateOj.getMonth()]+'/'+addZero(dateDg,2);
31
32$('#titlId')
33.append($('<li></li>')
34
35.append($('<a target="_blank"></a>').attr('href',likRSS).text(titRSS))
36.append(DateAp)
37)
38
39// スコープ外に出すためにいったんグローバル変数に置き換える
40k=i
41
42});//each
43
44console.log(k+1+'個');
45}) //done
46
47.fail(function(){window.alert('読み込みエラー');
48}) //fail
49}); //ready
50
51
52</script>
53
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる
質問する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/28 05:11
2019/04/28 05:31
2019/04/28 05:40
2019/04/28 05:53
2019/04/28 06:06
2019/04/28 06:52
2019/04/28 07:32