- 浏览: 93869 次
- 性别:
- 来自: 长沙
-
文章分类
最新评论
-
wangyudong:
家里是拨号上网,不行的,找到了一个Holer工具,只需要配置一 ...
【如何通过广域网访问局域网的服务器?】 -
叮咚可乐名:
大数据就是这么任性第一季数据结构和算法http://pan.b ...
数据结构与算法-简介 -
戢_时光:
...
【Java集合之二】Set集合 -
lzg406:
HTTP默认方式下,使用持久连接。 这个值得推敲
【应用层】之一:HTTP协议与FTP协议 -
mute_:
特别腻害呢
正则表达式1:概念
本文围绕以下三个部分展开:
一、XML概述
二、DOM解析
案例一
一、XML概述
(1)XML(eXtensible Markup Language):可扩展标记语言,属于一种标记语言。
(2)XML是一种解析文件内容的语言,XML需要拥有“解析程序”(Parser)才可以处理XML的数据,XML重视对文件中的数据解析。
XML解析器是指可以解析XML文件的程序。
(3)XML与HTML
HTML的目的是显示数据,重视的是数据显示的效果。
XML在写法上十分类似HTML,在功能上能够补足HTML标记的不足,拥有更多的扩展性。
XML并没有如同HTML—般的默认标记,事实上用户需要自己定义描述数据所需的各种标记。
XML设计的目的是用来描述数据,着重在数据的自身上。
二、DOM解析
DOM:Document Object Model,文本对象模型。
DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许使用DOM API遍历XML树、检索所需的数据。
使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于SAX的实现更加简单。
但是,因为DOM需要将XML文件的所有内容以文档树方式存放在内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM也是可行的。
案例一
1. 在java下面创建 persons.xml。里面写入XML内容。
2. 创建 com.android.pojo 包,里面创建 Person.java 的 pojo 类,用来封装XML文件中的一条记录。
3. 创建com.android.service包,用于放处理业务逻辑的类。在该包下创建 DomPersonService.java 的类,是一个使用DOM方式解析XML的业务逻辑类。
4. 在测试包下面创建一个单元测试类:PersonServiceTest,用于进行JUnit单元测试。
5. 在测试类中对DOM解析进行测试。写testDom测试方法。
运行的时候,会报错:
因为不能直接读取到java文件夹下面的persons.xml文件,而是通过DomPersonService类中,从流里面读取的。流中的文件是从真机/虚拟机中获取的。
而persons.xml文件并不在真机/虚拟机中,因此要打包,将其放到其中。
6. 使用流读取 classpath 下的文件(通过手工命令方式):
然后,再测试,就可以正常解析了。
一、XML概述
二、DOM解析
案例一
一、XML概述
(1)XML(eXtensible Markup Language):可扩展标记语言,属于一种标记语言。
(2)XML是一种解析文件内容的语言,XML需要拥有“解析程序”(Parser)才可以处理XML的数据,XML重视对文件中的数据解析。
XML解析器是指可以解析XML文件的程序。
(3)XML与HTML
HTML的目的是显示数据,重视的是数据显示的效果。
XML在写法上十分类似HTML,在功能上能够补足HTML标记的不足,拥有更多的扩展性。
XML并没有如同HTML—般的默认标记,事实上用户需要自己定义描述数据所需的各种标记。
XML设计的目的是用来描述数据,着重在数据的自身上。
二、DOM解析
DOM:Document Object Model,文本对象模型。
DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许使用DOM API遍历XML树、检索所需的数据。
使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于SAX的实现更加简单。
但是,因为DOM需要将XML文件的所有内容以文档树方式存放在内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM也是可行的。
案例一

1. 在java下面创建 persons.xml。里面写入XML内容。
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="10"> <name>段誉</name> <age>16</age> </person> <person id="11"> <name>乔峰</name> <age>32</age> </person> </persons> <!-- 1. Table: persons : 根元素 person子节点:一条记录 属性id:主键列 name/age:其他字段 name/age的文本节点:其他字段的值 Element Node 元素节点 Text Node 文本节点 xm.substring(start,length) new String(ch,start,length) -->
2. 创建 com.android.pojo 包,里面创建 Person.java 的 pojo 类,用来封装XML文件中的一条记录。
package com.android.pojo; /** * Created by Xiangdong Lee on 2015/8/25. */ public class Person { private String id; private String name; private String age; @Override public String toString() { return "Person{" + "id=" +id +",name='" +name + '\'' +",age="+age+'?'; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
3. 创建com.android.service包,用于放处理业务逻辑的类。在该包下创建 DomPersonService.java 的类,是一个使用DOM方式解析XML的业务逻辑类。
package com.android.service; import com.android.pojo.Person; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; /** * 通过 DOM 解析 XML文件 -- DOM 解析 Person 的 业务逻辑类 * * Created by Xiangdong Lee on 2015/8/25. */ public class DomPersonService { public static List<Person> getPersons(InputStream is) throws Exception { List<Person> persons = new ArrayList<Person>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 在内存中形成dom树(缺点:耗内存) - 适合文件比较小 Document document = builder.parse(is); Element root = document.getDocumentElement(); NodeList personNodes = root.getElementsByTagName("person"); for (int i = 0; i < personNodes.getLength(); i++) { Person person = new Person(); Element personElement = (Element) personNodes.item(i); String id = personElement.getAttribute("id"); String name = document.getElementsByTagName("name").item(i) .getFirstChild().getNodeValue(); String age = document.getElementsByTagName("age").item(i).getFirstChild() .getNodeValue(); // 把值封装到对象中 person.setId(id); person.setName(name); person.setAge(age); // 把对象加入集合中 persons.add(person); } return persons; } }
4. 在测试包下面创建一个单元测试类:PersonServiceTest,用于进行JUnit单元测试。
package com.android.dataparsing; import android.test.InstrumentationTestCase; import android.util.Log; /** * Junit 单元测试 -- 要先连接真机/模拟器。 * 第一步.继承 InstrumentationTestCase 测试案例类 * 第二步.定义测试方法:方法名必须以 小写的 testXxx 开头 * 第三步.选中方法名,右击 -> Run -> testXxx() * * Created by Xiangdong on 2015/8/25. */ public class PersonServiceTest extends InstrumentationTestCase { private static final String TAG = "MainActivity"; public void testLog() { Log.v(TAG, "This is Junit."); } }


5. 在测试类中对DOM解析进行测试。写testDom测试方法。
package com.android.dataparsing; import android.test.InstrumentationTestCase; import android.util.Log; import com.android.pojo.Person; import com.android.service.DomPersonService; import java.io.InputStream; import java.util.List; /** * Junit 单元测试 -- 要先连接真机/模拟器。 * 第一步.继承 InstrumentationTestCase 测试案例类 * 第二步.定义测试方法:方法名必须以 小写的 testXxx 开头 * 第三步.选中方法名,右击 -> Run -> testXxx() * <p/> * Created by Xiangdong on 2015/8/25. */ public class PersonServiceTest extends InstrumentationTestCase { private static final String TAG = "MainActivity"; public void testLog() { Log.v(TAG, "This is Junit."); } /** * 该方法有可能抛出异常,直接在此抛出即可 * * @throws Exception */ public void testDom() throws Exception { // xml文件读到流中间去了 InputStream is = getClass().getClassLoader().getResourceAsStream("persons.xml"); // 进行 DOM 解析 -- 因为 getPersons 是 static 的,因此直接用 类名.方法名 List<Person> persons = DomPersonService.getPersons(is); // 用日志循环输出出来 for (Person person : persons) { Log.v(TAG, person.toString()); } } }
运行的时候,会报错:

因为不能直接读取到java文件夹下面的persons.xml文件,而是通过DomPersonService类中,从流里面读取的。流中的文件是从真机/虚拟机中获取的。
而persons.xml文件并不在真机/虚拟机中,因此要打包,将其放到其中。
6. 使用流读取 classpath 下的文件(通过手工命令方式):




然后,再测试,就可以正常解析了。
发表评论
-
【攻克Android (43)】WebView (网络视图)
2015-09-09 22:15 1273本文围绕以下两个部分展开: 一、WebView WebVi ... -
WebView (网络视图)
2015-09-09 22:12 0本文围绕以下两个部分展开: 一、WebView WebVi ... -
【攻克Android (41)】HttpURLConnection
2015-09-08 17:43 1411本文围绕以下三个部分展开: 一、HttpURLConnec ... -
HttpURLConnection
2015-09-08 17:42 0本文围绕以下三个部分展开: 一、HttpURLConnec ... -
【攻克Android (40)】JSON解析
2015-09-07 20:49 1318本文围绕以下三个部分 ... -
JSON解析
2015-09-07 20:47 0本文围绕以下三个部分 ... -
【攻克Android (39):XML解析之四】Simple方式解析XML
2015-08-27 18:38 1808本文围绕以下三个部分 ... -
【攻克Android (38):XML解析之三】Pull方式解析XML
2015-08-27 09:25 1785本文围绕以下两个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (37):XML解析之二】SAX方式解析XML
2015-08-26 15:15 926本文围绕以下两个部分展开: 一、SAX解析 案例一 ... -
【XML解析之一】SAX方式解析XML
2015-08-26 02:58 0本文围绕以下四个部分展开: 一、SAX解析 案例一 ... -
DOM方式解析XML案例
2015-08-26 00:26 0本文围绕以下四个部分展开: 一、DOM解析 案例一 ... -
【XML解析之四】Simple方式解析XML
2015-08-27 18:36 0本文围绕以下三个部分 ... -
【XML解析之一】Pull方式解析XML
2015-08-26 02:56 0本文围绕以下四个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:22 908本文围绕以下四个部分 ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:21 0本文围绕以下四个部分 ... -
【攻克Android (45)】四大组件之 ContentProvider
2015-08-18 16:24 1165本文围绕以下两个部分展开: 一、ContentProvide ... -
【攻克Android (32)】Notification 通知
2015-08-17 19:57 1001本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
Notification 通知
2015-08-17 19:56 0本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
BroadcastReceiver完整版
2015-08-17 13:15 0本文围绕以下四个部分展开: 一、广播 案例一:系统广播(属于 ... -
【攻克Android (33)】四大组件之 BroadcastReceiver
2015-08-17 13:14 1219本文围绕以下三个部分 ...
相关推荐
JavaScript(简称JS)是一种轻量级的解释型编程语言,主要应用于网页和网络应用开发,实现客户端的交互功能。在“小贝程序员生活\课件\js\js习题.rar”这个压缩包中,我们可以期待找到一系列与JavaScript相关的练习...
在JavaScript文件中,开发者可以找到用于解析和处理极验验证码逻辑的脚本,这些脚本可能涉及DOM操作、网络请求以及逻辑判断等。Python文件可能包含了后端处理逻辑,或者是用于自动化测试、数据处理等辅助功能。JSON...
"项目29",可能是一个特定的软件开发项目,而"攻城塔1"可能是这个项目的一个阶段或者子任务,暗示着需要构建或攻克的技术难关。在这个场景下,我们将深入探讨JavaScript的相关知识点。 JavaScript是一种解释型、弱...
原型是JavaScript的核心特性之一,用于实现对象之间的继承。你可以通过实例学习如何创建对象、访问属性、方法,以及如何利用原型链进行继承。 此外,DOM(Document Object Model)操作也是JavaScript的重要部分。...
JavaScript挑战是一种旨在提升开发者JavaScript技能的实践性任务。在JavaScript的世界里,掌握好这门语言不仅可以帮助你...通过逐一攻克这些挑战,你将能够更加熟练地运用JavaScript和CSS,成为一名更优秀的Web开发者。
在IT行业中,JavaScript是一种至关重要的编程语言,尤其在网络开发领域占据着核心地位。"挑战带回家"这个项目可能是一个旨在帮助开发者提升JavaScript技能的练习集,通过一系列的代码挑战来加强理解和应用能力。下面...