Android中的XML解析-DOM的使用与开发技巧
16lz
2021-01-26
我们现在的大多开发项目中都难免和服务器端打交道,交互的过程无非是数据输入和输出,当我们将接口要求的数据按照格式传输到服务器端后,就会得到服务器端返回的数据,在行业内数据大多会使用被普遍接受和采用的XML格式(也有不少使用JSON)来组织数据进行返回,当我们获得XML时就可以解析获得自己需要的数据,或许是操作结果,或许是需要展示的数据列表,在Android中主要有三种的XML解析方式分别是SAX、DOM、PULL,这期我主要讲DOM的基本原理、应用和开发技巧,其他的两种方式会在后面的几期进行介绍。
1.DOM的基本原理:
DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。
2.DOM的基本使用
Xml代码
- <?xmlversion="1.0"encoding="UTF-8"?>
- <persons>
- <personid="1">
- <name>叶问</name>
- <age>23</age>
- </person>
- <personid="2">
- <name>李小龙</name>
- <age>17</age>
- </person>
- </persons>
- importjava.io.InputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importjavax.xml.parsers.DocumentBuilder;
- importjavax.xml.parsers.DocumentBuilderFactory;
- importorg.w3c.dom.Document;
- importorg.w3c.dom.Element;
- importorg.w3c.dom.Node;
- importorg.w3c.dom.NodeList;
- /**
- *使用Dom解析xml文件
- *
- */
- publicclassDomXMLReader{
- publicstaticList<Person>readXML(InputStreaminStream){
- List<Person>persons=newArrayList<Person>();
- DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
- try{
- DocumentBuilderbuilder=factory.newDocumentBuilder();
- Documentdom=builder.parse(inStream);
- Elementroot=dom.getDocumentElement();
- NodeListitems=root.getElementsByTagName("person");
- //查找所有person节点
- for(inti=0;i<items.getLength();i++){
- Personperson=newPerson();
- //得到第一个person节点
- ElementpersonNode=(Element)items.item(i);
- //获取person节点的id属性值
- person.setId(newInteger(personNode.getAttribute("id")));
- //获取person节点下的所有子节点(标签之间的空白节点和name/age元素)
- NodeListchildsNodes=personNode.getChildNodes();
- for(intj=0;j<childsNodes.getLength();j++){
- Nodenode=(Node)childsNodes.item(j);
- //判断是否为元素类型
- if(node.getNodeType()==Node.ELEMENT_NODE){
- ElementchildNode=(Element)node;
- //判断是否name元素
- if("name".equals(childNode.getNodeName())){
- //获取name元素下Text节点,然后从Text节点获取数据person.setName(childNode.getFirstChild().getNodeValue());
- }elseif(“age”.equals(childNode.getNodeName())){
- person.setAge(newShort(childNode.getFirstChild().getNodeValue()));
- }
- }
- }
- persons.add(person);
- }
- inStream.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnpersons;
- }
3.Dom开发小技巧
1)快速获得一个简单XML中的某项数据,改方法只适用于某个属性在DOM中只存在一个
Java代码
- publicstaticStringgetValByTagName(Documentdoc,StringtagName){
- NodeListlist=doc.getElementsByTagName(tagName);
- if(list.getLength()>0){
- Nodenode=list.item(0);
- NodevalNode=node.getFirstChild();
- if(valNode!=null){
- Stringval=valNode.getNodeValue();
- returnval;
- }
- }
- returnnull;
- }
2)快速的将数据列表转换成对象列表
如上述基本使用中的XML例子,先建立一个和XML对应的类,属性名称必须与XML中的名称一致,如:
Java代码- publicclassPerson(){
- privateStringname;
- privateStringage;
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetAge(Stringage){
- this.age=age;
- }
- publicStringgetAge(){
- returnage;
- }
- }
然后采用映射机制
Java代码
- NodeListnodeList=doc.getElementsByTagName("person");
- intlen=nodeList.getLength();
- for(inti=0;i<len;i++){
- Nodenode=nodeList.item(i);
- Personbean=(Person)convertToBean(Person.class,node);
- }
- publicstaticObjectconvertToBean(Classclazz,Nodeele){
- Objectobject=null;
- try{
- object=clazz.newInstance();
- Class[]parameterTypes=newClass[]{String.class};
- NodeListlist=ele.getChildNodes();
- intlen=list.getLength();
- for(inti=0;i<len;i++){
- try{
- Nodenode=list.item(i);
- StringnodeName=node.getNodeName();
- StringnodeVal="";
- NodevalueNode=node.getFirstChild();
- if(valueNode!=null){
- nodeVal=valueNode.getNodeValue();
- }
- Object[]arguments=newObject[]{nodeVal};
- if(nodeName.length()>0){
- Stringfirst=nodeName.substring(0,1);
- Stringlast=nodeName.substring(1);
- Methodmethod=clazz.getMethod("set"+first.toUpperCase()+last,parameterTypes);
- method.invoke(object,arguments);
- }
- }catch(NoSuchMethodExceptione){
- }
- }
- returnobject;
- }catch(Exceptione){
- e.printStackTrace();
- returnnull;
- }
- }
更多相关文章
- 一句话锁定MySQL数据占用元凶
- Android(安卓)日志管理
- Android(安卓)如何导入已有的外部数据库
- android 地铁最短路线换乘查询系统(1)
- Android省市区滚轮默认显示已选择的项
- Android(安卓)Socket 发送与接收数据问题: 发送后的数据接收到总
- Android(安卓)内存优化代码篇总结
- Android(安卓)如何从系统图库中选择图片
- 作为一个Android开发者,你迷茫了吗?(内附1T大数据学习资料)