我们现在的大多开发项目中都难免和服务器端打交道,交互的过程无非是数据输入和输出,当我们将接口要求的数据按照格式传输到服务器端后,就会得到服务器端返回的数据,在行业内数据大多会使用被普遍接受和采用的XML格式(也有不少使用JSON)来组织数据进行返回,当我们获得XML时就可以解析获得自己需要的数据,或许是操作结果,或许是需要展示的数据列表,在Android中主要有三种的XML解析方式分别是SAXDOMPULL,这期我主要讲DOM的基本原理、应用和开发技巧,其他的两种方式会在后面的几期进行介绍。

1.DOM的基本原理:

DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

2.DOM的基本使用

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <persons>
  3. <personid="1">
  4. <name>叶问</name>
  5. <age>23</age>
  6. </person>
  7. <personid="2">
  8. <name>李小龙</name>
  9. <age>17</age>
  10. </person>
  11. </persons>

Java代码
  1. importjava.io.InputStream;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importjavax.xml.parsers.DocumentBuilder;
  5. importjavax.xml.parsers.DocumentBuilderFactory;
  6. importorg.w3c.dom.Document;
  7. importorg.w3c.dom.Element;
  8. importorg.w3c.dom.Node;
  9. importorg.w3c.dom.NodeList;
  10. /**
  11. *使用Dom解析xml文件
  12. *
  13. */
  14. publicclassDomXMLReader{
  15. publicstaticList<Person>readXML(InputStreaminStream){
  16. List<Person>persons=newArrayList<Person>();
  17. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  18. try{
  19. DocumentBuilderbuilder=factory.newDocumentBuilder();
  20. Documentdom=builder.parse(inStream);
  21. Elementroot=dom.getDocumentElement();
  22. NodeListitems=root.getElementsByTagName("person");
  23. //查找所有person节点
  24. for(inti=0;i<items.getLength();i++){
  25. Personperson=newPerson();
  26. //得到第一个person节点
  27. ElementpersonNode=(Element)items.item(i);
  28. //获取person节点的id属性值
  29. person.setId(newInteger(personNode.getAttribute("id")));
  30. //获取person节点下的所有子节点(标签之间的空白节点和name/age元素)
  31. NodeListchildsNodes=personNode.getChildNodes();
  32. for(intj=0;j<childsNodes.getLength();j++){
  33. Nodenode=(Node)childsNodes.item(j);
  34. //判断是否为元素类型
  35. if(node.getNodeType()==Node.ELEMENT_NODE){
  36. ElementchildNode=(Element)node;
  37. //判断是否name元素
  38. if("name".equals(childNode.getNodeName())){
  39. //获取name元素下Text节点,然后从Text节点获取数据person.setName(childNode.getFirstChild().getNodeValue());
  40. }elseif(“age”.equals(childNode.getNodeName())){
  41. person.setAge(newShort(childNode.getFirstChild().getNodeValue()));
  42. }
  43. }
  44. }
  45. persons.add(person);
  46. }
  47. inStream.close();
  48. }catch(Exceptione){
  49. e.printStackTrace();
  50. }
  51. returnpersons;
  52. }

3.Dom开发小技巧

1)快速获得一个简单XML中的某项数据,改方法只适用于某个属性在DOM中只存在一个

Java代码
  1. publicstaticStringgetValByTagName(Documentdoc,StringtagName){
  2. NodeListlist=doc.getElementsByTagName(tagName);
  3. if(list.getLength()>0){
  4. Nodenode=list.item(0);
  5. NodevalNode=node.getFirstChild();
  6. if(valNode!=null){
  7. Stringval=valNode.getNodeValue();
  8. returnval;
  9. }
  10. }
  11. returnnull;
  12. }

2)快速的将数据列表转换成对象列表

如上述基本使用中的XML例子,先建立一个和XML对应的类,属性名称必须与XML中的名称一致,如:

Java代码
  1. publicclassPerson(){
  2. privateStringname;
  3. privateStringage;
  4. publicvoidsetName(Stringname){
  5. this.name=name;
  6. }
  7. publicStringgetName(){
  8. returnname;
  9. }
  10. publicvoidsetAge(Stringage){
  11. this.age=age;
  12. }
  13. publicStringgetAge(){
  14. returnage;
  15. }
  16. }

然后采用映射机制

Java代码
  1. NodeListnodeList=doc.getElementsByTagName("person");
  2. intlen=nodeList.getLength();
  3. for(inti=0;i<len;i++){
  4. Nodenode=nodeList.item(i);
  5. Personbean=(Person)convertToBean(Person.class,node);
  6. }
  7. publicstaticObjectconvertToBean(Classclazz,Nodeele){
  8. Objectobject=null;
  9. try{
  10. object=clazz.newInstance();
  11. Class[]parameterTypes=newClass[]{String.class};
  12. NodeListlist=ele.getChildNodes();
  13. intlen=list.getLength();
  14. for(inti=0;i<len;i++){
  15. try{
  16. Nodenode=list.item(i);
  17. StringnodeName=node.getNodeName();
  18. StringnodeVal="";
  19. NodevalueNode=node.getFirstChild();
  20. if(valueNode!=null){
  21. nodeVal=valueNode.getNodeValue();
  22. }
  23. Object[]arguments=newObject[]{nodeVal};
  24. if(nodeName.length()>0){
  25. Stringfirst=nodeName.substring(0,1);
  26. Stringlast=nodeName.substring(1);
  27. Methodmethod=clazz.getMethod("set"+first.toUpperCase()+last,parameterTypes);
  28. method.invoke(object,arguments);
  29. }
  30. }catch(NoSuchMethodExceptione){
  31. }
  32. }
  33. returnobject;
  34. }catch(Exceptione){
  35. e.printStackTrace();
  36. returnnull;
  37. }
  38. }

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)日志管理
  3. Android(安卓)如何导入已有的外部数据库
  4. android 地铁最短路线换乘查询系统(1)
  5. Android省市区滚轮默认显示已选择的项
  6. Android(安卓)Socket 发送与接收数据问题: 发送后的数据接收到总
  7. Android(安卓)内存优化代码篇总结
  8. Android(安卓)如何从系统图库中选择图片
  9. 作为一个Android开发者,你迷茫了吗?(内附1T大数据学习资料)

随机推荐

  1. Android(安卓)图片加圆角以及时间处理工
  2. android 打包错误
  3. Android Packaging Problem
  4. Android时间获取与使用
  5. Android(安卓)gallery实现图片的左右循环
  6. 设置android的布局文件的背景颜色为黑色
  7. Android集成华为、小米、OPPO、VIVO、极
  8. Android自制浏览器WebView-android学习之
  9. android tv 实现全屏画竖线
  10. android好博客