2012-07-17 146 views
1

我需要解组通过Yahoo的YQL Webservices获取的一段XML。 的XML看起来是这样的:使用Java泛型解析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> 

重复的“结果”关键是不要的方式错误。

我想用下面的类来解组此:

@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元件的返回是通用ElementNSImpl在信息搜索结果的代替。

有关如何处理此问题的任何建议?

干杯, 马克

回答

0

我结束了重构代码,使YQL一类的代替接口YQL和创建类GoogleYQL实现该接口和处理整个GoogleYQL类为T.这工作。仍然好奇,如果上述问题是可以解决的,但。