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:[email protected]">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