Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          xstream是個(gè)好東西。對于配置文件的讀取很方便。在mybog中我就用到了。不過今天打算用yupoo的api來做相冊。發(fā)現(xiàn)xstream對于xmlnode的attribute解析支持不是那么的好。
          對于這種節(jié)點(diǎn)格式的非常的簡單
          <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的文檔。果然找到答案了。
          自己寫一個(gè)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里面找到了這個(gè)兩個(gè)方法。

          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

          這兩個(gè)方法都是從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 on 2007-01-17 18:24 莫多 閱讀(8000) 評論(2)  編輯  收藏 所屬分類: Other

          FeedBack:
          # re: xstream對xmlnode的屬性(attribute)解析的問題。
          2007-01-18 09:19 | Ivan Chen(西濱)
          新版的xstream不用那么麻煩了(說實(shí)話,要自己寫一個(gè)converter倒不如直接用jdom好了)
          對于attribute,這樣寫
          stream.useAttributeFor("id",String.class);
          就可以。好像也沒有順序問題?  回復(fù)  更多評論
            
          # re: xstream對xmlnode的屬性(attribute)解析的問題。[未登錄]
          2007-01-18 10:05 | 莫多
          哦。是么?趕緊下載一個(gè)新版試試。  回復(fù)  更多評論
            

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62254
          • 排名 - 845

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 侯马市| 上杭县| 东港市| 宁津县| 梁山县| 且末县| 夏邑县| 临江市| 繁昌县| 武宁县| 互助| 门源| 天柱县| 辉县市| 宁城县| 比如县| 涟水县| 年辖:市辖区| 凌海市| 日喀则市| 正镶白旗| 璧山县| 金秀| 泰宁县| 保靖县| 阿勒泰市| 岱山县| 息烽县| 泸西县| 达尔| 乌兰浩特市| 留坝县| 丹东市| 昔阳县| 安国市| 涟源市| 全椒县| 措勤县| 新邵县| 沁阳市| 马公市|