xstream是個好東西。對于配置文件的讀取很方便。在mybog中我就用到了。不過今天打算用yupoo的api來做相冊。發(fā)現(xiàn)xstream對于xmlnode的attribute解析支持不是那么的好。
對于這種節(jié)點格式的非常的簡單
<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的結(jié)果是這樣的
<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);
????}
}
然后調(diào)用的地方修改一下就ok了。
XStream?stream?=?new?XStream();
stream.registerConverter(new?YupooResultConverter());
stream.alias("result",?YupooResult.class);
參考:
http://xstream.codehaus.org/converter-tutorial.html
2007年1月18日更新。
這里感謝網(wǎng)友 ?的提示。原來新版的xstream可以簡單的解決了。在1.2.1的doc里面找到了這個兩個方法。
useAttributeFor
public void useAttributeFor(java.lang.String?fieldName,
java.lang.Class?type)
- Use an XML attribute for a field or a specific type.
- Parameters:
fieldName
- the name of the field
type
- the Class of the type to be rendered as XML attribute
- Throws:
XStream.InitializationException
- if no AttributeMapper
is available
- Since:
- 1.2
useAttributeFor
public void useAttributeFor(java.lang.Class?type)
- Use an XML attribute for an arbotrary type.
- Parameters:
type
- the Class of the type to be rendered as XML attribute
- Throws:
XStream.InitializationException
- if no AttributeMapper
is available
- Since:
- 1.2
這兩個方法都是從1.2開始支持的。
也不用自己寫converter了。這樣就可以了
????????stream.alias("result",?YupooResult.class);
????????stream.useAttributeFor("page",?Integer.class);
????????stream.useAttributeFor("pages",?Integer.class);
????????stream.useAttributeFor("perpage",?Integer.class);
????????stream.useAttributeFor("total",?Integer.class);
????????stream.alias("photo",?YupooPhoto.class);
????????stream.useAttributeFor("id",?String.class);
????????stream.useAttributeFor("owner",?String.class);
????????stream.useAttributeFor("title",?String.class);
????????stream.useAttributeFor("host",?String.class);
????????stream.useAttributeFor("dir",?String.class);
????????stream.useAttributeFor("filename",?String.class);

?? 除經(jīng)特別注明外,本文章版權(quán)歸
莫多泡泡所有.
署名,非商業(yè)用途,保持一致.???
somebody(莫多)
posted @
2007-01-17 18:24 莫多 閱讀(7998) |
評論 (2) |
編輯 收藏
? 上周更新了一下myblog,添加了一個Filter,做統(tǒng)計訪問用。可是后來發(fā)現(xiàn)出現(xiàn)亂碼問題了。找了很久都沒有找到問題。debug的時候看到 CharacterEncodingFilter確實是執(zhí)行了。不過就是沒有效果。執(zhí)行之前是ISO-8859-1編碼的,執(zhí)行之后還是, CharacterEncodingFilter就沒有起到作用。后來終于找到問題的原因了。原來是Filter配置先后順序的原因。
?????? 剛開始的配置是這樣的:
????
<
filter-mapping
>
????????
<
filter-name
>
requestCounterFilter
</
filter-name
>
????????
<
url-pattern
>
*.jhtml
</
url-pattern
>
????
</
filter-mapping
>
??
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
/dwr/*
</
url-pattern
>
????
</
filter-mapping
>
????
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
*.jhtml
</
url-pattern
>
????
</
filter-mapping
>
????
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
*.jsp
</
url-pattern
>
????
</
filter-mapping
>
? 先經(jīng)過那個統(tǒng)計的filter然后再經(jīng)過編碼的filter。這樣的話編碼的filter就不起作用了。只要吧編碼的filter放到最前面就沒有問題了。改成這樣就好。
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
/dwr/*
</
url-pattern
>
????
</
filter-mapping
>
????
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
*.jhtml
</
url-pattern
>
????
</
filter-mapping
>
????
????
<
filter-mapping
>
????????
<
filter-name
>
encodingFilter
</
filter-name
>
????????
<
url-pattern
>
*.jsp
</
url-pattern
>
????
</
filter-mapping
>
????
????
<
filter-mapping
>
????????
<
filter-name
>
requestCounterFilter
</
filter-name
>
????????
<
url-pattern
>
*.jhtml
</
url-pattern
>
????
</
filter-mapping
>
以后大家一定要注意啊。順序問題也是很重要的。
?? 除經(jīng)特別注明外,本文章版權(quán)歸莫多泡泡所有.
署名,非商業(yè)用途,保持一致.???somebody(莫多)
posted @
2006-12-27 10:37 莫多 閱讀(2690) |
評論 (3) |
編輯 收藏