XML解析(二),DOM解析XML

转载自   XML解析(二),DOM解析XML

上篇文章向大家介绍了SAX解析XML,为了这篇文章理解起来更加方便,所以还没看过SAX解析XML文章的,请戳这【XML解析(一)】SAX解析XML ,这次给大家带来XML解析系列之DOM解析XML

一、概述

DOM,擦,这什么鬼,肯定又是什么东西的简称了,没错,DOMDocument Object Model的简称,翻译过来就是文档对象模型,是W3C组织推荐的处理可扩展标志语言的标准编程接口,它以面向对象的方式描述了文档模型,所以有一个名词叫对象树,也叫文档树。借用百度的一张图片描述一下这个文档树

关于这个文档树,有几个名词需要知道:

  • 节点(Node):XML中的每个成分都是节点

    1. 文档节点:即图中的:Document
    2. 每个标签是一个原元素节点即:Element
    3. XML元素标签之间的为文本节点:TextNode
    4. 每个XML元素节点的属性为属性节点:Attribute
  • xml常见的节点类型

    1. Node : DOM最基本的数据类型
    2. Element:常见的元素节点
    3. Attr:代表元素的属性
    4. Text:元素或者Att的值(内容)
    5. Document:代表整个XML文档

细心看过SAX解析XML那篇文章的朋友可能发现了在那篇文章中没少出现标签,节点,文档的字眼,其实这些名词是借用DOM的。OK,对于DOM如要需要了解更多请google或者百度一下,下面我们看看DOM解析XML的优缺点:

DOM解析优点

  • 整个文档树在内存中,便于操作;
  • 可以修改,删除、重新排列XML;
  • 可以随机访问任何一个节点,访问效率高。

DOM解析的缺点:

  • 占用内存大,占用资源多
  • 解析速度慢

DOM解析适用场合:

  • 需多次访问这些数据;
  • 对解析效率要求不高;
  • 硬件资源充足(内存、CPU)。

二、DOM解析XML实战

DOM解析XML步骤很简单,基本就两步,我们只需要知道DOM的层次结构及很实用DOM的一些重要的方法就可以使用DOM解析XML了

为了方便,这里先给出项目的目录结构,在文章结束后会将本Demo的代码帖上

目录结构:


  • 解析步骤:

    1. 解析XML文件得到Document对象
    2. 操作Document对象的一系列方法取出我们关心的数据
  • DOM的一些常用的方法:

    1. Document.getDocumentElement():返回xml文档的根元素
    2. Element.getAttribute():获取属性值
    3. Element.getChildNodes():返回孩子节点集
    4. Element.getFirstChild():返回第一个孩子节点,通常是TextNode
    5. Element.getLastChild():得到最后一个孩子节点
    6. … 
       ps:DOM 相关的API的一些方法基本见名知义,在使用的时候可以查看相应的API文档或者借助Eclipse等IDE的提示选择相应的方法使用。

OK,知道了DOM解析XML的步骤及方法,我们新建一个Android项目开始学习一下DOM解析过程

新建一个Android项目DomParseXmlDemo,为了和SAX解析做个比较,我们还是来通过解析的users.xml来练习一下DOM解析。

1、 新建一个xml文件,users.xml

<?xml version="1.0" encoding="UTF-8"?>
<users><user id="1"><name>毕向东</name><password>bxd123</password></user><user id="2"><name>韩顺平</name><password>hsp123</password></user><user id="3"><name>马士兵</name><password>msb123</password></user>
</users>

2、同样新建一个User类,User.java

package com.example.domparsexmldemo;public class User{private long id;private String name;private String password;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

3、简单将解析的步骤封装到一个工具类XmpParseUtils.java中,新建一个方法:

第一步:加载xml资源,得到XML的Document对象

        // 1. 加载XML资源,这里和SAX一样,也可以是File或者UriInputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("users.xml");// 2. 得到文档构建工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 3. 通过构建工厂生产构建类DocumentBuilder newDocumentBuilder = factory.newDocumentBuilder();// 4. 那这个构建类将XML资源解析得到Document对象Document doc = newDocumentBuilder.parse(is);

 上面的代码基本上是一个模板代码,只是xml路径会不同,这里得到了Document的对象,完成了解析步骤的第一步,接下来完成第二步

第二步:操作Doc,解析相应的数据

        // 得到根节点Element root = doc.getDocumentElement();// 根据指定的标签名称得到相应的节点集合NodeList userNodes = root.getElementsByTagName("user");for(int i=0;i<userNodes.getLength();i++){ // 依次解析每个user节点Element userElement = (Element) userNodes.item(i);// 获取user节点的属性int id = Integer.valueOf(userElement.getAttribute("id"));User user = new User();user.setId(id);// 接下来解析子元素NodeList childNodes = userElement.getChildNodes();for(int j=0;j<childNodes.getLength();j++){Node childNode = childNodes.item(j);if(childNode.getNodeType() == Node.ELEMENT_NODE){ // 判断是不是元素节点String nodeName = childNode.getNodeName(); // 得到节点名称String value = childNode.getFirstChild().getNodeValue(); // 得到第一个子节点的值,这里为TextNodeif("name".equals(nodeName)){ // 如果当前的节点为name,那么它的值就是user的nameuser.setName(value);}else if("password".equals(nodeName)){ // 如果当前的节点为password,那么它的值就是user的passworduser.setPassword(value);}}}users.add(user);}

 注释写的很详细,大家有没有注意到Element.getElementsByTagName(String tagName)方法,这个方法简直和html中document的一模一样,只不过这里的Document没有和html的document的getElementById()getElementsByName()方法,这是因为xml和html不一样,xml标签,属性等系统没有赋予特殊的含义,都是自己定义的,是一种数据格式,而html的id或class属性被赋予了特殊含义,所以xml自然没有那两个方法了,呵呵

OK,万事具备,只差测试了,下面是见证奇迹的时刻

同样是使用Android的单元测试,关于Android的单元测试,和上篇【XML解析(一)】SAX解析XML一样,只需要改一下目标包名,这里就不多说了,有疑问的参考【XML解析(一)】SAX解析XML 这篇文章。

测试结果:

可以看到,这里我们使用DOM同样完成了XML的解析,到这里我们学会了DOM解析XML,对比一下SAX解析,发现DOM解析更加简单,原理无非拿到根节点,然后依次解析子节点,遍历循环,调用相应方法,没有事件触发,而我们只需要掌握XML DOC文档树的层次结构,然后解析相应xml的时候,对比着xml的内容,我们就可以操作DOC API相应的方法解析出相应数据了。

总结:DOM解析XML相对于SAX解析XML更加简单,掌握XML DOC文档树结构是掌握DOM解析XML的重中之重,可以说掌握了XML文档树结构,DOM解析XML就非常简单了,简单地调用一些方法即可。

上面这篇文章由于个人理解及学习笔记总结,如果有理解错的地方,欢迎大家指出,与君共勉,大家一起进步。

Demo下载地址:http://download.csdn.net/detail/ydxlt/9328835



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过反射将字符串转换为类

package org.entity; /*** 本案例演示如何通过反射将字符串转换为类* */ public class Test {public static void main(String[] args) {String user "org.entity.User";//字符串是该类的全限定名try {Class clzz Class.forName(user);Object classObjclzz.newInst…

在C语言的函数定义中 如果不需要返回结果,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句...

语言义中语句数定省略保险般来能一几项的职以下说有。来源统计济数据的主要调查得社会经是获&#xff0c;需要包括如下容(的内应该。具体是指&#xff0c;结果积反映房空置面商品&#xff0c;而尚未出屋期末报告工可供销的房出租出租已竣是指售和售或。语言义中语句表现心理学的…

如何将 Microsoft Bot Framework 链接至微信公共号

说到 Microsoft Bot Framework 其实微软发布了已经有一段时间了&#xff0c;有很多朋友可能还不太了解&#xff0c;微软Bot的功能今天我给大家简单的介绍一下&#xff0c;Bot Framework的开发基础以及如何使用Bot Framework和我们的一个现有的三方客服&#xff08;例如一个微信…

XML解析(一),SAX解析XML

转载自 XML解析&#xff08;一&#xff09;&#xff0c;SAX解析XML一、概述SAX&#xff0c;全称Simple API for XML&#xff0c;是一种以事件驱动的XMl API&#xff0c;是XML解析的一种新的替代方法&#xff0c;解析XML常用的还有DOM解析&#xff0c;PULL解析&#xff08;Andr…

go编译库给c语言函数返回值,go语言 函数return值的几种情况

IOS开发基础知识--碎片361:tabBarController跳转到另一个一级页面 当我们用tabBarController时,若已经到其中一个TabBar的子页,又要跳转到某一个一级的页面时,可以这样写 //这样就可以避免跳 ...MapReduce的MapTask任务的运行源码级分析TaskTracker任务初始化及启动task源码级分…

编程语言的发展趋势及未来方向(3):函数式编程

关于声明式编程的还有一部分重要的内容&#xff0c;那便是函数式编程。函数式编程已经有很长时间的历史了&#xff0c;当年LISP便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言&#xff0c;如APL、Haskell、Scheme、ML等等。关于函数式编程在学术界已经有过…

idea中@Data标签getset不起作用

原 idea中Data标签getset不起作用 2017年06月08日 11:22:40 seapeak007 阅读数 27070 spring cloud中使用Data标签&#xff0c;不用手动添加get set方法&#xff0c;但是如果项目中其他类中使用getset方法&#xff0c;如果报错&#xff0c;原因是idea中没有添加Lombok插件&a…

浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系

转载自 浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系众所周知&#xff0c;SAX与DOM是JAVA中两大核心XML解析API类库&#xff0c;而JAXP,JDOM与DOM4J都是基于这两大核心API而衍生出来的。今日兴起看了看相关资料&#xff0c;写篇文章总结总结^.^。 SAX与DOM 首先需要说明白的是SAX…

调用反射类的方法

package org.entity;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 本案例演示如何通过反射将字符串转换为类* */ public class Test2 {public static void main(String[] args) {String user "org.entity.User";//字…

android 新的布局,Android新布局方式ConstraintLayout快速入门教程

前言在android开发中&#xff0c;我们通常是手写布局&#xff0c;很少会用拖动来写布局&#xff0c;虽然constraintlayout在i/o上以拖动来展现了各种功能&#xff0c;我估计在以后开发中&#xff0c;程序员还是习惯手撸代码。我自己试着拖着用了一下&#xff0c;用得不是很明白…

编程语言的发展趋势及未来方向(2):声明式编程与DSL

这里先从声明式&#xff08;Declarative&#xff09;编程谈起。 目前我们在编写软件时大量使用的是命令式&#xff08;Imperative&#xff09;编程语言&#xff0c;例如C#&#xff0c;Java或是C等等。这些语言的特征在于&#xff0c;写出的代码除了表现出“什么&#xff08;Wha…

HtmlParser提取网页中的纯文本信息

转载自 HtmlParser提取网页中的纯文本信息HTMLParser 一个解析web页面的开源类库。 准备学习下搜索方面的技术&#xff0c;就学习了些网络爬虫的知识。最近一直在一个点上困惑&#xff0c;如何提取一个网页上的纯文本信息。要使用正则表达式的话呢&#xff0c;需要考…

编程语言的发展趋势及未来方向(1):历史回顾及趋势概述

大家好&#xff0c;我是Anders Hejlsberg&#xff0c;现在是微软的Technical Fellow&#xff0c;担任C#编程语言的首席架构师&#xff0c;也参与并领导.NET Framework以及各种语言的开发。我现在打算谈一下……实际上是我脑海中一些影响未来5到10年编程语言设计的内容。比如C#或…

调用反射类的指定方法

package org.entity;import java.lang.reflect.Method;/*** 本案例演示如何通过反射将字符串转换为类* */ public class Test2_2 {public static void main(String[] args) {String user "org.entity.User";//字符串是该类的全限定名try {Class clzz Class.forName…

springboot创建项目 编写dao serviece 和controller 持久层用mybatis

11 刷新一下pom 万一没有引入进去 jpa和mybatis选择哪个&#xff1f; 1.看领导要求 2.都会最好 多学点是没错的

android查看wifi是否双频,Android判断wifi是5G还是2.4G

我一开始看这帖子&#xff0c;找不到答案&#xff0c;为了后来的人&#xff0c;我来回复吧。WifiManager wifiManager (WifiManager) getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo wifiManager.getConnectionInfo();根据wifiInfo.getFrequency()可以判断是不是…

java过滤html标签获取纯文本信息

转载自 java过滤html标签获取纯文本信息 package com.lyt.base.util;import java.util.regex.Pattern;public class FilterHtmlUtil {public static String Html2Text(String inputString){String htmlStr inputString; //含html标签的字符串String textStr "";java…

综述:编程语言的发展趋势及未来方向

程序设计离不开编程语言&#xff0c;但是编程语言在国内的大环境中似乎一直是个二等公民。国内的计算机教育和工程培训&#xff0c;似乎一直在宣传“语言不重要&#xff0c;重要的是思想”&#xff0c;“语言一通百通”等观点&#xff0c;甚至在许多人眼中“语言的讨论”完全是…

IntelliJ IDEA: 无法创建Java Class文件

IntelliJ IDEA: 无法创建Java Class文件 2018年06月21日 22:49:44 dandelion9508 阅读数 11864 今天打开项目时&#xff0c;发现右击新建不了java.class文件&#xff0c;于是尝试了以下方法&#xff1a; &#xff08;1&#xff09;选择 File——>Project Structure——>…