XML - JAXP技术 - DOM解析

  中秋节刚过去,龙哥布置的几个任务还没做完。唉,又开始学XML了。

 

  DOM解析的基本思路:

    1、将整个XML文件一次性读入内存

    2、将整个XML看做一棵树

    3、XML中的每一个标签,属性,文本都看做是树上的一个结点

    4、然后可以对结点进行增删改查的操作

 

  话不多说,上代码。

  

  1、首先我在D:\ABC中新建了一个文本文件,重命名为stus.xml,以下是文件中的内容

    <?xml version = "1.0" encoding = "GBK" ?>

    <stus class = "S160401A">

    <stu num = "001" >

    <name>张三</name>

    <age>20</age>

    <sex>男</sex>

    </stu>

 

    <stu num = "002">

    <name>李四</name>

    <age>21</age>

    <sex>女</sex>

    </stu>

 

    <stu num = "003">

    <name>王五</name>

    <age>22</age>

    <sex>男</sex>

    </stu>

    </stus>

    在第一行是XML声明<?xml version="1.0" encoding="GBK"  ?>,version表示版本号,encoding表示编码方式,微软的记事本用的是国标的编码方式,如果要用UTF-8,则要在另存为窗口中修改编码方式为UTF-8。

    

     必须且只能有一对根标签,我写的根标签是<stus></stus>。其他的就不多说了。

 

  2、这是一个学生类,定义了一些属性和get、set方法

 

public class Student {
	public static String Class;
	private String name;
	private int num;
	private int age;
	private char sex;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

}

 

 

  3、这是用DOM解析的类,看这个类之前还要了解一下。

    DocumentBuilderFactory DOM解析器工厂

    DocumentBuilder DOM解析器

    Document 文档对象

    Node 结点【接口】

    Element 元素结点【标签结点】

    Attr 属性结点

    Text 文本结点

    Node 是Document,Element,Attr,Text的父接口

    NodeList  结点列表

    NamedNodeMap 一个结点的所有属性

 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import bean.Student;

public class DOMParser {

	public static void main(String[] args) throws Exception {

		// 得到解析器工厂对象
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		// 生产一个解析器对象
		DocumentBuilder builder = factory.newDocumentBuilder();

		// 开始解析XML文件,得到解析的结果,是一个Document对象
		// Document对象叫做文档树对象
		Document dom = builder.parse("D:\\ABC\\stus.xml");

		// 通过Document对象提取数据
		// Document对象的第一个子节点是根节点[根标签]
		Node root = dom.getFirstChild();
		// 获得标签的名字
		String str = root.getNodeName();
		// 获得根节点的属性
		NamedNodeMap attrs = root.getAttributes();
		// 强转成Attr类型 属性类
		Attr attr = (Attr) attrs.getNamedItem("class");
		// 获得属性里的值
		String v = attr.getValue();
		System.out.println(v);

		// 获得所有的学生-------------------------------------
		NodeList list = root.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
			// 判断是否是标签结点
			if (node instanceof Element) {
				Element e = (Element) node;
				// 获得标签结点里属性的值
				String num = e.getAttribute("num");
				System.out.println(num);

				// 输出标签中的文本
				// System.out.println(e.getTextContent());

				// 继续获得stu的子节点
				NodeList nodeList = e.getChildNodes();
				for (int j = 0; j < nodeList.getLength(); j++) {
					Node n = nodeList.item(j);
					if (n instanceof Element) {
						Element ele = (Element) n;
						// 获得元素结点的标签名字
						String nodeName = ele.getNodeName();
						// 获得元素结点标签中的文本
						String value = ele.getTextContent();
						if (nodeName.equals("name")) {
							System.out.println("姓名:" + value);
						} else if (nodeName.equals("age")) {
							System.out.println("年龄:" + value);
						} else if (nodeName.equals("sex")) {
							System.out.println("性别:" + value);
						}
					}
				}
			}
		}
	}
}

 

 

  自己在其中总结了一些方法:

  DocumentBuilderFactory类:

    public static DocumentBuilderFactory newInstance(); //得到解析器工厂对象

    public abstract DocumentBuilder newDocumentBuilder(); //生产一个解析器对象

 

  DocumentBuilder类:

    public Document parse(String uri); //解析路径为uri的XML文件,得到解析的结果是一个Document对象

 

  Node类:

    public Node getFirstChild(); //得到Document对象的第一个子结点,也就是根结点、或者叫根标签,在上面的代码中得到的是stus,看上面的第1点中的XML文件的内容。

    public NamedNodeMap getAttributes();//获得结点的属性

    public NodeList getChildNodes();//获得所有子结点

    public String getNodeName();//获得标签的名字 

    public String getTextContent() throws DOMException;//获得标签结点中的文本

 

  NamedNodeMap类:    

    public Node getNamedItem(String name);//返回所有名字为name的结点

 

  Attr类:

    public String getValue();//获得属性里的值

 

  NodeList类:

    public Node item(int index);//返回第index个结点

 

  Element类:

    public String getAttribute(String name);//获得标签结点里属性name的值

 

  

 

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

java新手入门 - 2016-09-19 17:09:16

java新手入门 Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案。在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供Java培训初学者做个参考。 我在学习Java的过程中主要围绕以下几个方面来学习: 1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。 2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。

自动id生成器类 - 2016-09-19 17:09:13

import java.util.concurrent.atomic.AtomicInteger;AtomicInteger idCreate = new AtomicInteger();idCreate.incrementAndGet();//返回int类型 //获取当前的值 public final int get() //取当前的值,并设置新的值 public final int getAndSet(int newValue) //获取当前的值,并自增 public final int getAnd
[size=medium]    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 19

JAVA 常量池与String - 2016-09-19 14:09:50

  提到常量池,一般是指运行时常量池,是方法区的一部分。方法区就是通常说的永久代。那么常量池中会存储那些数据呢?   ①编译期生成的各种字面量和符号引用   ②也有可能将运行期间的常量放入常量池   先看第一种: 编译期生成的各种字面量和符号引用,这部分数据经过编译后存在.class文件的‘常量池’中,注意这个所谓的‘常量池’是‘静态常量池’,静态常量池的数据会在类加载后放入运行时常量池。举个例子   测试一 public class ConstantPoolAndStrTest { String str

btrace跟踪组数创建 - 2016-09-19 14:09:44

之前有人问我怎么用btrace跟踪数组的创建,这里记录一下。 需要靠Kind.NEWARRAY,比如要跟踪int数组的创建可以这么写 @BTracepublic class BtraceCreateArray { @OnMethod(clazz = "/.*/", method = "/.*/", location = @Location(value = Kind.NEWARRAY, clazz = "int") ) public static void findCreateIntArray() { pri

操作json - 2016-09-19 14:09:07

总是记不住一些零碎的知识点,这次开个专栏来记录,不定期更新: 1:json格式互转 1.1 :model转换json JSONObject jsonObject = JSONObject.fromObject(model);

解析数据存储MySQL - 2016-09-18 14:09:05

为了适应不同项目对不同感兴趣属性的解析存储,数据存储结构采用纵向的属性列表方式,即一个url页面多个属性存储多条记录方式,并且按照text,html,data,num几大典型类型分别对应存储。 创建UTF-8字符集的nutch数据库,并执行表初始化脚本,参考DDL: CREATE TABLE `crawl_data` ( `url` varchar(255) NOT NULL, `code` varchar(255) NOT NULL, `name` varchar(255) DEFAULT NULL,
一、定义:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。     与需要在编译时进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。 二、类加载的时机     类从被加载到虚拟机内存中

java播放器 - 2016-09-18 14:09:03

最近写了一段java播放器代码 /* dkplus专业搜集和编写实用电脑软件教程,搜集各种软件资源和计算机周边(java网络编程,seo网站优化,web开发,lnmp,java网络编程,毕业论文设计),独立制作视频和ppt和音频微信公众号,点击进入 dkplus官方博客http://dkplus.iteye.com 微信搜索dkplus关注公众号可获取海量计算机周边资源。 */ package simpleaudioplayer; import javax.media.*;import java.io.I

Servlet之JSP_01概述 - 2016-09-17 18:09:08

一、什么是JSP JSP (Java Server Pages) 提供一种简便、快速的方式以生成动态的(dynamic)网页内容。 JSP运行原理 JSP 是 Servlet 的模板文件。 JSP最终由 Web 容器解析生成 Servlet 类( .java 文件),并编译成为 .class 文件,最后执行。 植入 JAVA 代码 可以告诉解析器,JSP 模板中的哪一部分是原生的 JAVA 代码,不需要解析。 在JSP中使用 % % 嵌入 JAVA 代码。 被 web 容器基于 JSP 文件而解析生成的