1

Yahoo の YQL Web サービスから取得した XML の一部をアンマーシャリングする必要があります。XML は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="8" yahoo:created="2012-07-16T16:43:15Z" yahoo:lang="en-US">
<results>
    <results>
    <GsearchResultClass>GwebSearch</GsearchResultClass>
    <unescapedUrl>http://www.test.com/nl/nieuws</unescapedUrl>
    <url>http://www.test.com/nl/nieuws</url>
    <visibleUrl>www.test.com</visibleUrl>
    <cacheUrl>http://www.google.com/search?q=cache:0B4z0dyd94gJ:www.test.com</cacheUrl>
    <title>Nieuws | test.com</title>
    <titleNoFormatting>Nieuws | test.com</titleNoFormatting>
    <content>text text text text text text text text  &lt;b&gt;...&lt;/b&gt;</content>
    </results>
    [...]
</results>
</query>

ちなみに、重複した「results」キーはエラーではありません。

私は次のクラスでこれを非整列化しようとしています:

@XmlRootElement(name="query")
public class YQL<T> {

    List<T> results;

    @XmlElementWrapper(name="results")
    @XmlElement(name="results")
    public List<T> getResults() {
        return results;
    }

    public void setResults(List<T> results) {
        this.results = results;
    }   
}

@XmlType
public class SearchResult{

    String url,title,content;

    @XmlElement
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
[...]


public class YQLFeedReaderImpl<T> implements FeedReader<YQL<T>> {

private Class<T> resultClazz;

[...]

final JAXBContext context = JAXBContext.newInstance(YQL.class,resultClazz);

final Unmarshaller unmarshaller = context.createUnmarshaller();

URL url = new URL([....]);

return (YQL<T>) unmarshaller.unmarshal(url);

T 要素に対して返されるのは、SearchResult ではなく汎用の ElementNSImpl です。

これに対処する方法について何か提案はありますか?

乾杯、マーク

4

1 に答える 1

0

最終的にコードをリファクタリングして、YQLをクラスではなくインターフェイスYQLにし、そのインターフェイスを実装するクラスGoogleYQLを作成し、GoogleYQLクラス全体をTとして扱いました。これでうまくいきました。ただし、上記の問題が解決できるかどうかはまだ気になります。

于 2012-07-18T16:47:16.567 に答える