?__mode=rssのRSSデータからトラックバックをしたトラックバック先のURLを取得するプログラムの改正

このQ&Aのポイント
  • Javaプログラムを使用して、指定したURLのRSSデータからトラックバック先のURLを取得する方法を紹介します。
  • 元のプログラムにはエラー処理が欠けていたため、エラーが発生した場合には例外をスローするように改正します。
  • また、指定したURLの後ろに?__mode=rssを付加させる方法も説明します。
回答を見る
  • ベストアンサー

?__mode=rssのRSSデータからトラックバックをしたトラックバック先のURLを取得するプログラムの改正

import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class GetTBlink { public static void main(String[] args) { try { String url = "http://app.blog.livedoor.jp/takapon_ceo/tb.cgi/50030092?__mode=rss"; DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); Document doc = builder.parse(url); Element root = doc.getDocumentElement(); NodeList list0 = root.getElementsByTagName("error"); Element element0 = (Element)list0.item(0); NodeList list1 = root.getElementsByTagName("rss"); Element element = (Element)list1.item(0); NodeList list2 = root.getElementsByTagName("channel"); Element element1 = (Element)list2.item(0); NodeList list3 = element1.getElementsByTagName("item"); for (int i=0; i < list3.getLength() ; i++) { Element element2 = (Element)list3.item(i); NodeList linkList = element2.getElementsByTagName("link"); Element linkElement = (Element)linkList.item(0); String link = linkElement.getFirstChild().getNodeValue(); System.out.println("リンク:" + link ); } } catch (Exception e) { e.printStackTrace(); } } } 以上のプログラムを次のように改正したいです。 pingurl = http://app.blog.livedoor.jp/takapon_ceo/tb.cgi/50030092として、 pingurlの後ろに ?__mode=rssを付加させるようにして String url を指定したい (String url = (pingurl)?__mode=rss のようなイメージ)  よろしくお願いします。

  • shows
  • お礼率96% (48/50)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

String pingurl ="http://app.blog.livedoor.jp/takapon_ceo/tb.cgi/50030092"; String url = pingurl+"?__mode=rss";

shows
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • 取得したURLを配列で保持させたい

    いつもお世話になっています。 以前「__mode=rssのRSSデータからトラックバックをしたトラックバック先のURLを取得するプログラムの改正」の質問をしたものです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1734032 ここで、抽出したリンクの一覧のURLのブログにさらにトラックバックされているブログがあったらそのブログにトラックバックをしたURLも取得したいと思っています。 そこで、先日の質問のプログラム public class GetTBlink { public static void main(String[] args) { try { String url = "http://app.blog.livedoor.jp/takapon_ceo/tb.cgi/50030092?__mode=rss"; … Element linkElement = (Element)linkList.item(0); String link = linkElement.getFirstChild().getNodeValue(); System.out.println("リンク:" + link ); によって抽出したURLを利用したいので、 取得したString link を配列で保持させるにはどのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • JavaによるXMLの中身の取り出し

    以下のindex.xmlのようなXML文書があるとして、Javaプログラム で<Title></Title>の中身を抜き出したいのですが、うまく取り 出せません。 【index.xml】 <?xml version='1.0' encoding='UTF-8' ?> <?xml-stylesheet type="text/xsl" href="../../../_sys/style.xsl"?> <RDF xmlns:r="○○" xmlns:d="○○" xmlns:s="○○" xmlns="○○"> <ExternalPage about="http://www.pref.iwate.jp/~hp0920/"> <d:Title><s:char code="39">'</s:char>99岩手総体</d:Title> </ExternalPage> </RDF> 【ソース】 public class Example { public static void main(String[] args) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("index.xml")); Element root = doc.getDocumentElement(); NodeList ExternalPageLst = root.getElementsByTagName("ExternalPage"); for (int j=0; j < ExternalPageLst.getLength() ; j++) { Element ExternalPageEle = (Element)ExternalPageLst.item(j); NodeList TitleLst = ExternalPageEle.getElementsByTagName("d:Title"); for (int k=0; k < TitleLst.getLength() ; k++) { Element TitleEle = (Element)TitleLst.item(k); NodeList CharLst = ExternalPageEle.getElementsByTagName("s:char"); Element CharEle = (Element)CharLst.item(0); String Char = CharEle.getFirstChild().getNodeValue(); String Title = TitleEle.getFirstChild().getNodeValue(); System.out.println(Title); } } catch (Exception e) { e.printStackTrace(); } } } 【実行結果】 null 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • Xercesを使ったjavaでのXML解析

    DOMを使ってXML文書を解析するJavaのソースコードで、DOMパーサは、クラス org.apache.xerces.parsers.DOMParserで参照している下記のプログラムで、 [Fatal Error] :17:109: The entity name must immediately follow the '&' in the entity reference. org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 109; The entity name must immediately follow the '&' in the entity reference. のエラーが出てしまって、解決策が分かりかねています。Javaのネットワークプログラミングに詳しい方、御教示願えればと思います。 package nikkei; import java.io.ByteArrayInputStream; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class TwitterSearch { public static void main(String[] args) throws Exception { TwitterSearch search = new TwitterSearch(); search.search("日経ソフトウエア"); } public void search(String keyword) throws Exception { SearchAPIClient client = new SearchAPIClient(); String xml = client.execute(keyword); parse(xml); } private void parse(String xml) throws Exception { DOMParser parser = new DOMParser(); try { parser.parse(new InputSource(new ByteArrayInputStream(xml.getBytes()))); Document doc = parser.getDocument(); NodeList entries = doc.getElementsByTagName("entry"); for (int i = 0; i < entries.getLength(); i++) { String name = null; String tweet = null; Element entry = (Element) entries.item(i); NodeList titleList = entry.getElementsByTagName("title"); if (titleList.getLength() == 1) { tweet = titleList.item(0).getTextContent(); } NodeList authorList = entry.getElementsByTagName("author"); if (authorList.getLength() == 1) { Element author = (Element) authorList.item(0); NodeList nameList = author.getElementsByTagName("name"); if (nameList.getLength() == 1) { name = nameList.item(0).getTextContent(); } } System.out.println(name + "さんのツイート"); System.out.println("\t" + tweet); } } catch (Exception e) { e.printStackTrace(); } } } package nikkei; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; public class SearchAPIClient { public String execute(String keyword) throws Exception { String url = "https://twitter.com/search?q=" + keyword; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); if (entity != null) { return EntityUtils.toString(entity); } else { return null; } } } よろしくお願いいたします。

    • ベストアンサー
    • Java
  • XMLファイルの読み方

    以下の様なXMLファイルがあるとします。 "groupノード(?)のアトリビュートであるgrpIDとnumStdGrpの値を取得したいです。 JavaでDOMパーサーを使うことに限定します。 <?xml version="1.0" encoding="UTF-8"?> <dataHeader <numStudent>150</numStudent> <dataMain <band name="B1"> <group grpID="1" numStdGrp="15"/> </band> <band name="B2"> <group grpID="2" numStdGrp="10"/> </band> </dataMain> </dataHeader> 自分では試して見たのは以下まで。 File fXmlFile = new File("C:\XMLファイル名"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); (1)numStudentとdataMainノードまでは簡単: 例) NodeList nListDM = doc.getElementsByTagName("dataMain"); 上記からnListDM.item(0)してノード取得できて、getNodeName()で名前表示する。 (2)bandノード(?)もgetElementsByTagNameで取れます。 NodeList nListBand = doc.getElementsByTagName("band"); このノードリストの長さは2です。それぞれ、アトリビュート「name」の値(B1, B2)は以下の様にして取れます。 Node nNodeBand = nListBand.item(0); Element bElement = (Element) nNodeBand; して、bElement.getAttribute("name")。 問題はこの以降。 初めに書きましたように、 groupノード(?)のアトリビュートであるgrpIDとnumStdGrpの値どうやって取得するのでしょうか? getElementsByTagName(group)はだめです。どのbandのgroupか、区別できないので。 Java+XMLに詳しい方、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • URLでプログラムを操作させるか判別させたい

    先日http://oshiete1.goo.ne.jp/kotaeru.php3?q=1734032 の質問をした者です。 ところで、先日の質問でプログラム中に例としてあげたライブドアのブログのように、 __mode=rssに対応している場合 http://app.blog.livedoor.jp/takapon_ceo/tb.cgi/50030092?__mode=rss は、トラックバック先のURLを取得できるのですが、 __mode=rssに対応していないブログ (例えばhttp://tb.plaza.rakuten.co.jp/hirobastaff/diary/200510210000/?__mode=rss(楽天スタッフblog)) のようにレスポンスとしてエラー(error要素が1)を返すブログに対してはときはリンクを抽出することができないので、 URLで判別させて、リンクを取得する操作を実行するかしないかを決めたいです。 つまり、__mode=rssに対応しているブログ、例えばライブドアやヤプログやココログなどのブログに対しては、 リンクを抽出させるプログラムを実行させるため、 プログラム中のString url を見て、そのURLが__mode=rssに対応しているブログのURLの場合はプログラムを実行させる、 例えば、String url にblog.livedoorやjpyaplog.jpやcocolog-nifty.comなど含まれているなど、 __mode=rssに対応しているのでブログのURLが含まれていたら、トラックバック先のURLを抽出させる操作を実行させる。 一方、String urlを見て、__mode=rssに対応しているブログのurlにマッチしないブログのURLの場合はelseとして、 リンクを抽出させるプログラムは実行させず、違う処理をさせたいです。 (例えば、HTMLからトラックバック先のURLをパースさせる処理など) このようにするには先日の質問のプログラムをどのように改正させればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • JavaでのXMLデータ抽出について

    いつも、お世話になります。 以前、Perlでも似たような質問をさせていただきましたが、結局、Javaで作ることになりました。ところが、以下の現象が発生して困っております。 プログラムは、下記のXmlファイルを読み込ませ"★"の部分を抽出してくるというプログラムです。 読み込んだ結果として、次のようなものが欲しいとすると、 memoNumber = Class_A MemoNumber = 53 memoNumber = Class_B MemoNumber = 67 : 実際には、以下のようになってしまいます。 memoNumber = Class_A MemoNumber = 53 memoNumber = Class_A MemoNumber = 42 : つまり、"memoNumber"の最初の要素しか見ておらず、次の"MemoNumberList"以下のタグ内を探しに行ってしまうようです。 そこまでは分かったのですが対処法法が分かりません。 読み込ませたいXMLファイルは以下のとおりです(データ数が膨大になるので一部省略をしています) <MemoBlockList> <Class ID="namae1" >★ <Local>1</Local> <AmemoWritingLocationList> <AmemoWritingLocation Length="50" Side="1">★ <CreateID>345.9886776</CreateID> <IDList> <IDNo IDNo="1">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">53</ClassName>★ <MemoNumber memoNumber="Class_B">67</ClassName>★ <MemoNumber memoNumber="Class_C">88</ClassName>★ <MemoNumber memoNumber="Class_D">00</ClassName>★ <MemoNumber memoNumber="Class_E">32</ClassName>★ </MemoNumberList> </IDNo> </IDList> <IDNo IDNo="2">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">42</ClassName>★ <MemoNumber memoNumber="Class_B">90</ClassName>★ <MemoNumber memoNumber="Class_C">101</ClassName>★ <MemoNumber memoNumber="Class_D">978</ClassName>★ <MemoNumber memoNumber="Class_E">21</ClassName>★ </MemoNumberList> </IDNo> </IDList> <IDNo IDNo="3">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">10</ClassName>★ <MemoNumber memoNumber="Class_B">1</ClassName>★ <MemoNumber memoNumber="Class_C">11</ClassName>★ <MemoNumber memoNumber="Class_D">99</ClassName>★ <MemoNumber memoNumber="Class_E">66</ClassName> </MemoNumberList> </IDNo> </IDList> </AmemoWritingLocation> <location>15</location> </AmemoWritingLocationList> </MemoBlock> </MemoBlockList> Javaのソースは以下のとおりです。 import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class MemoBlecks { public static void main(String[] args) { try { DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); Document doc = builder.parse(new File("MemoBlock.xml")); Element root = doc.getDocumentElement(); System.out.println("ルート要素のタグ名:" + root.getTagName()); System.out.println("***** 値リスト *****"); System.out.println("要素:memoNumberList"); System.out.println("値:MemoNumberList"); NodeList list = root.getElementsByTagName("MemoNumberList"); for (int i=0; i < list.getLength() ; i++) { Element element = (Element)list.item(i); String MemoNumber = element.getAttribute("memoNumber"); NodeList MemoNumberList = element.getElementsByTagName("MemoNumber"); Element MemoNumberElement = (Element)MemoNumberList.item(0); String MemoNumber = MemoNumberElement.getFirstChild().getNodeValue(); System.out.println("memoNumber="+memoNumber); System.out.println("MemoNumber="+MemoNumber); } } catch (Exception e) { e.printStackTrace(); System.out.println("このウィンドウ上で次の操作を実行してください..."); System.out.println("「右クリック→すべて選択→右クリック→テキストエディタを開き、evaluation.txtとして保存」"); } } } 開発環境は次のとおりです。 OS:WindowsXP HomeEdition SP2 Java:JDK1.6.0_04 Javaに関しては初心者レベルの知識しかありません。そのため、載せたものも少々おかしいですが、どなたかご教授のほどお願い致します。

    • ベストアンサー
    • Java
  • 実行対象のブログのURLは抽出させない

    以前の質問http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 のご回答のプログラムを改良してトラックバックされたブログURLを抽出する 以下のようなプログラムを作成しました。 (省略部分は参考プログラムとほぼ同じ。) class GetTBurlLivedoor { public static String[] getTBaddrLivedoor(String urlString){ … //ブログのURLを抽出。ただし、スペースの都合上ここではライブドアのみ抽出とする //indexOfを用いての範囲指定はせず、HTMLすべてに対してパース Pattern trackBack = Pattern.compile("http://blog.livedoor.jp/.*/archives/\\d+.html"); while((aLine = reader.readLine())!=null){ Matcher m = trackBack.matcher(aLine); if(m.find()){ addr+=m.group(0)+","; } … public static void main(String[] args){ String url = args[0]; //実行例 http://blog.livedoor.jp/takapon_ceo/archives/50030785.html String[] TBaddr = getTBaddrLivedoor(url); for(int i=0;i<TBaddr.length;i++) System.out.println(TBaddr[i]); } } そこで、URLを抽出する際に、実行対象となるブログ自身に関するURL 例)http://blog.livedoor.jp/takapon_ceo/archives/50034644.html などは抽出しないようにするため、 そのブログ自身のIDを含むURLは抽出しないような処理をしたいと思います。 例えば、ライブドアでは、ブログのIDは、 http://blog.livedoor.jp/ ID /archives/50030785.html となっているので、このID(実行例ではtakapon_ceo)を含むURLは抽出しないようにさせたいです。 このようにするには、どのようにプログラムを組めばよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • tomcat上のservletからapache上のhtmlへ

    現在tomcatにrss.java(コンパイル後class) と言うファイルがあります。 rss.java ------------------------------------------- package to.msn.wings.chap4; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.fetcher.FeedFetcher; import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher; public class RssParse extends HttpServlet { private static final String URL= "http://honyararahonyarara/index20.rdf"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FeedFetcher ff = new HttpURLFeedFetcher(); SyndFeed feed=null; try { feed = ff.retrieveFeed(new URL(URL)); } catch (Exception e) { throw new ServletException(e); } HashMap<String, String> map = new HashMap<String,String>(); for(SyndEntry entry : (List<SyndEntry>)feed.getEntries()){ map.put(entry.getTitle(), entry.getLink()); } request.setAttribute("feed", map); this.getServletContext().getRequestDispatcher("http://localhost/html/rss.html").forward(request,response); } } ------------------------------------------- またapache上にrss.htmlと言うファイルがあります。 rss.html ------------------------------------------- <html> <head> <title>RSS情報の展開</title> </head> <body> <h1 style="color:white;background-color:#525D76;font-size:22px;"> RSS情報の展開</h1> <ul> <c:forEach var="item" items="${requestScope['feed']}"> <li><a href="${item['value']}">${item['key']}</a></li> </c:forEach> </ul> </body> </html> ------------------------------------------- tomcat上のservletからapache上のhtmlに値を渡し 表示させたいのですがうまくいきません。 お心当たりある方がいらっしゃいましたら 書込みをお願い致します。

    • ベストアンサー
    • Java
  • jqueryでRSS内のdc:dateなどの要素の取得方法

    jqueryを使用してRSSのdc:dateやdc:subjectなどの要素を取得するにはどうしたらよいでしょうか。 現在以下のようなコードにしていまして、なんとなく取得したRSSの最初に書いてあるxmlns:dc="http://purl.org/dc/elements/1.1/" となってる部分を利用すればいいのかなと思い立ち、children関数などを使ってみましたが取得できませんでした。 $.ajax({ url: settings.xmllocation, async: true, cache: false, dataType: "xml", success: function(xml) { $(xml).find('item').each(function() { var title = $(this).find('title').text(); var url = $(this).find('link').text(); var date = $(this).children('http://purl.org/dc/elements/1.1/').find('dc:date').text(); var element = $('<div><a href="' + url + '">' + title + '('+date+')</a></div>'); $(container).append(element); elements.push(element); }); });

  • <forEach> 内で供給された "items" を反復処理する方法が不明です

    JSP、servletを実行すると 以下のエラーメッセージが 表示されてしまいます。 ---------------------------------- javax.servlet.jsp.JspTagException: <forEach> 内で供給された "items" を反復処理する方法が不明です ---------------------------------- ファイル構成は以下になります。 アプリケーションルート\WEB-INF\classes\Rssdata.java ---------------------------------- public class Rssdata{//データ格納用クラス public String[] title = new String[20]; public String[] link = new String[20]; public String[] day = new String[20]; } ---------------------------------- アプリケーションルート\WEB-INF\classes\RssOriginal.java ---------------------------------- import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.fetcher.FeedFetcher; import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher; public class RssOriginal extends HttpServlet { private static final String URL= "http://hoge.net/index20.rdf"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FeedFetcher ff = new HttpURLFeedFetcher(); SyndFeed feed=null; int i = 0;//for文用変数 Rssdata rssdata = new Rssdata();//rssデータ格納用クラス try { feed = ff.retrieveFeed(new URL(URL)); } catch (Exception e) { throw new ServletException(e); } Calendar cal = new GregorianCalendar(); for(SyndEntry entry : (List<SyndEntry>)feed.getEntries()){ entry.getPublishedDate(); rssdata.day[i] = cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH); rssdata.link[i] = entry.getLink(); rssdata.title[i] = entry.getTitle(); /* System.out.println(rssdata.day[i]); System.out.println(rssdata.link[i]); System.out.println(rssdata.title[i]); System.out.println(); */ i++; } request.setAttribute("feed", rssdata); this.getServletContext().getRequestDispatcher("/chap4/rss/index.jsp").forward(request,response); } } ---------------------------------- アプリケーションルート\chap4\rss\index.jsp ---------------------------------- <html> <head> <title>RSS情報の展開</title> </head> <body> <h1 style="color:white;background-color:#525D76;font-size:22px;"> RSS情報の展開</h1> <ul> <c:forEach var="item" items="${requestScope['feed']}"> <li><a href="${item['link']}">${item['title']}</a></li> </c:forEach> </ul> </body> </html> ---------------------------------- またこちらのページなど検索で色々調べましたが http://kamakura.cool.ne.jp/oppama/ssja/taglibs-core.html 理屈はなんとなくイメージできるのですが 具体的な解決方法がわかりませんでした。 宜しくお願い致します。