
xstream是个好东西。对于配置文件的读取很方便。在mybog中我就用到了。不过今天打算用yupoo的api来做相册。发现xstream对于xmlnode的attribute解析支持不是那么的好。
对于这种节点格式的非常的简单
<result>
????<page>1</page>
????<pages>1</pages>
????<perpage>100</perpage>
????<total>19</total>
????<photos>
????????<photo>
????????????<id>ff8080810fc8ac78010fd3f158d40a52</id>
????????????<owner>ff8080810f1a387b010f1a83d6530dfc</owner>
????????????<title>Gmail-2</title>
????????????<host>4</host>
????????????<dir>20061230</dir>
????????????<filename>231905_1463411198</filename>
????????</photo>
????</photos>
</result>
简单的alias一下就可以读到值了
File?file?=?new?File("src/test/java/com/jdkcn/test/result.xml");
BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(new?FileInputStream(file),?"UTF-8"));
XStream?stream?=?new?XStream();
stream.alias("result",?YupooResult.class);
stream.alias("photo",YupooPhoto.class);
YupooResult?result?=?(YupooResult)stream.fromXML(reader);
可是Yupoo的api返回的xmlrpc的结果是这样的
<result?page="1"?pages="1"?perpage="100"?total="19">
????<photos>
????????<photo?id="ff8080810fc8ac78010fd3f158d40a52"
????????????owner="ff8080810f1a387b010f1a83d6530dfc"?title="Gmail-2"?host="4"
????????????dir="20061230"?filename="231905_1463411198"?/>
????</photos>
</result>
这样就load不到值了。没法去mailist里面找答案,果然有人问。
Hello,
I am not sure about the subject but here is what I needed help for:
XML:
<field name="value">I am a Field.</field>
I have already tried several structures and nothing seem to work.
Is this possible for XStream? :)
How is the Java class form to support this?
Thanks!
有人回答是看Converter的文档。果然找到答案了。
自己写一个converter就可以了。
下面是我的converter
package?com.jdkcn.xstream;
import?java.util.ArrayList;
import?java.util.List;
import?com.jdkcn.yupoo.YupooPhoto;
import?com.jdkcn.yupoo.YupooResult;
import?com.thoughtworks.xstream.converters.Converter;
import?com.thoughtworks.xstream.converters.MarshallingContext;
import?com.thoughtworks.xstream.converters.UnmarshallingContext;
import?com.thoughtworks.xstream.io.HierarchicalStreamReader;
import?com.thoughtworks.xstream.io.HierarchicalStreamWriter;
/**
?*?@author?<a?href="mailto:rory.cn@gmail.com">somebody</a>
?*?@since?Jan?16,?2007?6:12:35?PM
?*?@version?$Id?YupooResultConverter.java$
?*/
public?class?YupooResultConverter?implements?Converter?{
????/*?(non-Javadoc)
?????*?@see?com.thoughtworks.xstream.converters.Converter#marshal(java.lang.Object,?com.thoughtworks.xstream.io.HierarchicalStreamWriter,?com.thoughtworks.xstream.converters.MarshallingContext)
?????*/
????public?void?marshal(Object?obj,?HierarchicalStreamWriter?writer,?MarshallingContext?context)?{
????????//?FIXME?unfinish.
????}
????/*?(non-Javadoc)
?????*?@see?com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks.xstream.io.HierarchicalStreamReader,?com.thoughtworks.xstream.converters.UnmarshallingContext)
?????*/
????public?Object?unmarshal(HierarchicalStreamReader?reader,?UnmarshallingContext?context)?{
????????YupooResult?result?=?new?YupooResult();
????????result.setPage(new?Integer(reader.getAttribute("page")));
????????result.setPages(new?Integer(reader.getAttribute("pages")));
????????result.setPerpage(new?Integer(reader.getAttribute("perpage")));
????????result.setTotal(new?Integer(reader.getAttribute("total")));
????????reader.moveDown();
????????List<YupooPhoto>?photos?=?new?ArrayList<YupooPhoto>();
????????while(reader.hasMoreChildren())?{
????????????reader.moveDown();
????????????YupooPhoto?photo?=?new?YupooPhoto();
????????????photo.setDir(reader.getAttribute("dir"));
????????????photo.setFilename(reader.getAttribute("filename"));
????????????photo.setHost(reader.getAttribute("host"));
????????????photo.setId(reader.getAttribute("id"));
????????????photo.setOwner(reader.getAttribute("owner"));
????????????photo.setTitle(reader.getAttribute("title"));
????????????photos.add(photo);
????????????reader.moveUp();
????????}
????????result.setPhotos(photos);
????????return?result;
????}
????/*?(non-Javadoc)
?????*?@see?com.thoughtworks.xstream.converters.ConverterMatcher#canConvert(java.lang.Class)
?????*/
????public?boolean?canConvert(Class?clazz)?{
????????return?clazz.equals(YupooResult.class);
????}
}
然后调用的地方修改一下就ok了。
XStream?stream?=?new?XStream();
stream.registerConverter(new?YupooResultConverter());
stream.alias("result",?YupooResult.class);
以后大家一定要注意啊。顺序问题也是很重要的。
?? 除经特别注明外,本文章版权归莫多泡泡所有.
署名,非商业用途,保持一致.???somebody(莫多)
参考:
http://xstream.codehaus.org/converter-tutorial.html