<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rory's Blog
    Happy study,Happy work,Happy life
    posts - 22,  comments - 46,  trackbacks - 0
    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)友 Ivan Chen(西濱)?的提示。原來新版的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);

    創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致
    ?? 除經(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 >


    以后大家一定要注意啊。順序問題也是很重要的。
    創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致?? 除經(jīng)特別注明外,本文章版權(quán)歸莫多泡泡所有.
    署名,非商業(yè)用途,保持一致.???somebody(莫多)

    posted @ 2006-12-27 10:37 莫多 閱讀(2690) | 評論 (3)編輯 收藏

    <2006年12月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(1)

    隨筆分類(27)

    隨筆檔案(22)

    Friends

    搜索

    •  

    積分與排名

    • 積分 - 62211
    • 排名 - 845

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 最近免费中文字幕4| 亚洲一区二区电影| 免费无码H肉动漫在线观看麻豆| 亚洲AV无码一区二区三区DV| 国产情侣激情在线视频免费看| 久久无码av亚洲精品色午夜| 亚洲伊人久久综合影院| 91免费人成网站在线观看18| 亚洲heyzo专区无码综合| 亚洲精品无码永久中文字幕| 五月婷婷综合免费| 精品国产免费人成网站| 亚洲福利一区二区精品秒拍| 亚洲成A人片在线观看中文 | 一区二区免费国产在线观看| 亚洲韩国—中文字幕| 色播在线永久免费视频| AAA日本高清在线播放免费观看| 国产精品亚洲四区在线观看 | 久久久久亚洲AV无码网站| 国产精品久久久久影院免费| 免费人妻无码不卡中文字幕系| MM1313亚洲国产精品| 亚洲欧洲国产综合| 亚洲综合日韩久久成人AV| 四虎在线免费播放| 最近高清中文字幕免费| 国产免费高清69式视频在线观看 | kk4kk免费视频毛片| 亚洲色丰满少妇高潮18p| 亚洲高清在线视频| 亚洲 综合 国产 欧洲 丝袜| av无码久久久久不卡免费网站 | 久草视频在线免费| 13小箩利洗澡无码视频网站免费| 国产成人高清亚洲一区91| 亚洲精品永久在线观看| 亚洲人成激情在线播放| 亚洲人成网站在线播放影院在线 | 国产无遮挡吃胸膜奶免费看视频| 91精品免费观看|