xstream對xmlnode的屬性(attribute)解析的問題。

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裏面找答案,果然有人問。





有人回答是看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








94475.html

莫多 2007-01-17 18:24 發表評論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章