almost 5 years ago

現在 http://www.google.com/m/services/trends/get は使用できないようです。

Simple は XMLフォーマット文書をシリアライズしたり、デシリアライズするためのライブラリです。Java オブジェクトをXMLへ変換したり、反対にXMLからJavaオブジェクトにすることができます。

Googleトレンドの急上昇ワードは、 http://www.google.com/m/services/trends/get からXML形式のデータとして取得できますが、Simpleを使ってデシリアライズ(XMLからJavaオブジェクトへ変換)するなら、XMLのエレメントやプロパティへのインタフェースとなるSetter,Getterを持つオブジェクトをクラスとして用意する必要があります。

import java.util.List;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Text;
 
@Root(name = "rtt")
public class GoogleTrendsResult {
    @Attribute(name = "version")
    private String version;
 
    @Element(name = "update")
    private String update;
 
    @Element(name = "language")
    private String language;
 
    @Element(name = "country")
    private String country;
 
    @ElementList(name = "item", inline = true)
    private List<Item> item;
 
    public String getVersion() {
        return version;
    }
 
    public void setVersion(String version) {
        this.version = version;
    }
 
    public String getUpdate() {
        return update;
    }
 
    public void setUpdate(String update) {
        this.update = update;
    }
 
    public String getLanguage() {
        return language;
    }
 
    public void setLanguage(String language) {
        this.language = language;
    }
 
    public String getCountry() {
        return country;
    }
 
    public void setCountry(String country) {
        this.country = country;
    }
 
    public List<Item> getItem() {
        return item;
    }
 
    public void setItem(List<Item> item) {
        this.item = item;
    }
}
 
class Item {
    @Element(name = "query")
    private String query;
 
    @Element(name = "rank")
    private int rank;
 
    @Element(name = "prev_rank", required = false)
    private int prev_rank;
 
    @Element(name = "score")
    private float score;
 
    @Element(name = "snippet")
    private Snippet snippet;
 
    @Element(name = "landing_page")
    private LandingPage landing_page;
 
    public String getQuery() {
        return query;
    }
 
    public void setQuery(String query) {
        this.query = query;
    }
 
    public int getRank() {
        return rank;
    }
 
    public void setRank(int rank) {
        this.rank = rank;
    }
 
    public int getPrev_rank() {
        return prev_rank;
    }
 
    public void setPrev_rank(int prev_rank) {
        this.prev_rank = prev_rank;
    }
 
    public float getScore() {
        return score;
    }
 
    public void setScore(float score) {
        this.score = score;
    }
 
    public Snippet getSnippet() {
        return snippet;
    }
 
    public void setSnippet(Snippet snippet) {
        this.snippet = snippet;
    }
 
    public LandingPage getLanding_page() {
        return landing_page;
    }
 
    public void setLanding_page(LandingPage landing_page) {
        this.landing_page = landing_page;
    }
}
 
class Snippet {
    @Attribute
    private String src;
    @Text
    private String value;
 
    public String getSrc() {
        return src;
    }
 
    public void setSrc(String src) {
        this.src = src;
    }
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
}
 
class LandingPage {
    @Attribute
    private String url;
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
}

解析対象のXMLはrtt要素をドキュメントルートに持ち、item要素がリストとして存在します。これをSimpleでデシリアライズするにはアノテーションを適切に使用する必要があります。アノテーションにはXMLの要素、属性、テキストを表現するものがあります。

@Root ドキュメントルート
@Element 要素
@Attribute 属性
@ElementList リスト状の要素
@Text タグで挟まれた値

また、これらアノテーションに対するオプションとして、フィールドと各XMLコンポーネントを紐付けるための名前、親に対してインラインであるか、要素の必要性の有無などを設定することができます。

name 変数のXML上の名称
inline 親に対してインラインであるか
required 必須のXMLコンポーネントか

クラスが作成できたら、Persisterを使ってデータの取得ができます。

Persister persister = new Persister();
GoogleTrendsResult googleTrendsResults = persister.read(GoogleTrendsResult.class, xml);
List<Item> items = googleTrendsResults.getItem();

反対にXMLとして保存したい場合はこうなります。

Serializer serializer = new Persister();
File file = new File("get.xml");
serializer.write(googleTrendsResults , file);
← java-universal-tween-engine - トゥイーンエンジンでダイナミックな変化を Android Holo Colors Generator - Android Holo ベースのテーマを作成する →