收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 2488|回复: 1

[java] Android下处理xml数据

[复制链接]
发表于 2010-5-18 22:27:24 | 显示全部楼层 |阅读模式
在PHP中,我习惯转换xml为数组,在android里面,我也喜欢这样,可以分配到map类型。
先看看示例数据:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <list>
  3.   <site id="65" url="http://www.aslibra.com" >阿权的书房</site>
  4.   <site id="5" url="http://www.google.com" >谷歌</site>
  5. </list>
复制代码


我们可以用一个 Map<Integer,Map<String,String>> 变量保存最后的结果:

  1. Map<Integer,Map<String,String>> sites = new HashMap<Integer,Map<String,String>>();

  2. try{
  3.   String myurl = "http://www.aslibra.com/teach/android/sites.xml";
  4.   URL url = new URL(myurl);
  5.   HttpURLConnection conn;
  6.   conn = (HttpURLConnection) url.openConnection();
  7.   conn.setDoInput(true);
  8.   conn.connect();
  9.   InputStream is = conn.getInputStream();
  10.   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  11.   DocumentBuilder builder = factory.newDocumentBuilder();
  12.   Document doc = builder.parse(is);
  13.   
  14.   NodeList nl = doc.getElementsByTagName("site");
  15.   int sites_number = nl.getLength();
  16.   
  17.   for (int i=0; i<sites_number; i++){
  18.     Node mysite = doc.getElementsByTagName("site").item(i);
  19.     Map<String,String> sitesChild = new HashMap<String,String>();
  20.     sitesChild.put("siteName", mysite.getFirstChild().getNodeValue());
  21.     for(int j=0;j<mysite.getAttributes().getLength();j++){
  22.       sitesChild.put( mysite.getAttributes().item(j).getNodeName(),
  23.           mysite.getAttributes().item(j).getNodeValue() );
  24.     }
  25.     sites.put(i, sitesChild);
  26.   }

  27. }catch(Exception e){
  28.   //Log.e(tag, e.toString() );
  29. }
  30. Log.d(tag, "size:"+sites.size() );
复制代码


简单的分析一下:

取得xml里site的所有节点 doc.getElementsByTagName("site")
取得某个子节点 doc.getElementsByTagName("site").item(i)
取得节点包含的字符串 mysite.getFirstChild().getNodeValue()
取得属性值 mysite.getAttributes().item(j).getNodeName()
取得属性的值 mysite.getAttributes().item(j).getNodeValue()

这有点复杂,貌似我也不习惯,可记住之后,自己就知道怎么取xml值了,一般xml有如下类型

  1. <A B="C">D</A>
复制代码


根据A取得此小段,D是此段的getFirstChild().getNodeValue()
B是此段的getAttributes().item(j).getNodeName()
C是此段的getAttributes().item(j).getNodeValue()
当然,有多个,那就循环一下即可

最终得到类似php数组类型,可以自己遍历来用:

  1. Map<Integer,Map<String,String>> sites = XXXX(前面的处理返回值);
  2. int len = sites.size();
  3. Map<String,String> row;
  4. for(int i=0;i<len;i++){
  5.   row = sites.get(i);
  6.   //比如row.get("url")
  7. }
复制代码


另外一种结构是这样的:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <list>
  3.   <site>
  4.     <url>http://www.aslibra.com</url>
  5.     <siteName>阿权的书房</siteName>
  6.   </site>
  7.   <site>
  8.     <url>http://www.google.com</url>
  9.     <siteName>谷歌</siteName>
  10.   </site>
  11. </list>
复制代码


相应的可以这样处理:

  1. Map<Integer,Map<String,String>> sites = new HashMap<Integer,Map<String,String>>();

  2. try{
  3.   String myurl = "http://www.aslibra.com/teach/android/sites2.xml";
  4.   URL url = new URL(myurl);
  5.   HttpURLConnection conn;
  6.   conn = (HttpURLConnection) url.openConnection();
  7.   conn.setDoInput(true);
  8.   conn.connect();
  9.   InputStream is = conn.getInputStream();
  10.   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  11.   DocumentBuilder builder = factory.newDocumentBuilder();
  12.   Document doc = builder.parse(is);
  13.   
  14.   NodeList nl = doc.getElementsByTagName("site");
  15.   int sites_number = nl.getLength();
  16.   
  17.   for (int i=0; i<sites_number; i++){
  18.     Node mysite = doc.getElementsByTagName("site").item(i);
  19.     Map<String,String> sitesChild = new HashMap<String,String>();
  20.     for(Node node=mysite.getFirstChild();node!=null;node=node.getNextSibling()){
  21.       if(node.getNodeType()==Node.ELEMENT_NODE){
  22.         //Log.d(tag, "myattrib:"+ node.getFirstChild().getNodeValue() );                     
  23.         sitesChild.put( node.getNodeName(),
  24.             node.getFirstChild().getNodeValue() );            
  25.       }
  26.     }
  27.     sites.put(i, sitesChild);
  28.   }

  29. }catch(Exception e){
  30.   //Log.e(tag, e.toString() );
  31. }
  32. Log.d(tag, "size:"+sites.size()+" / "+ sites.get(0).get("url") );
复制代码


这也达到同样的效果,这xml其实很容易让人糊涂的。。我也支撑不住啦!!

后续更新请留意原帖了,这里可能就不相应修改啦,只做分享:
http://www.aslibra.com/blog/post/android-xml-parse.php
发表于 2010-5-18 22:46:28 | 显示全部楼层
貌似跟普通的DOM操作差不多。
不过我相信应当还有更简单的处理办法才对,特别是用在手机这种移动终端上的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-8-8 18:05 , Processed in 0.122736 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表