对于这种节点格式的非常的简单
<
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 >
< 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的结果是这样的
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);
<
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里面找答案,果然有人问。
< photos >
< photo id ="ff8080810fc8ac78010fd3f158d40a52"
owner ="ff8080810f1a387b010f1a83d6530dfc" title ="Gmail-2" host ="4"
dir ="20061230" filename ="231905_1463411198" />
photos >
result >
Hello, I am not sure about the subject but here is what I needed help for: XML:I am a 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 somebody
* @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
莫多 2007-01-17 18:24 发表评论