xml的处理有两种方式dom和Sax

其中dom有3套api ,分别是dom和jdom和dom4j

 package com.gh.xml;

 import java.io.File;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Dom模式读取xml
* @author ganhang
*
*/
public class DomDemo {
public static void main(String[] args) throws Exception {
// 创建dom解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建一个dom解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 关联文件
File f = new File("src/1.xml");
// 开始解析
Document doc = db.parse(f);// 传文件或者字节流
// 根据节点获取数据
NodeList nl = doc.getElementsByTagName("teacher");
List<Teacher> teachers = new ArrayList<Teacher>();
Teacher t = null;
for (int i = 0; i < nl.getLength(); i++) {
Node teacherNode = nl.item(i);// 获取每个teacher节点
// 得到节点的属性id的值
String str = teacherNode.getAttributes().getNamedItem("id")
.getNodeValue();
//System.out.println(str);
t = new Teacher();
t.setId(Integer.parseInt(str));
// 获取teacher节点下的所有子节点
NodeList childNodeList = teacherNode.getChildNodes();
//System.out.println(childNodeList.getLength());
for (int j = 0; j < childNodeList.getLength(); j++) {
// 注意teacher有三个子节点#text name #text
Node childNode = childNodeList.item(j);
//System.out.println(childNode.getNodeName());
// 取name的子节点的值
if ("name".equals(childNode.getNodeName())) {
t.setName(childNode.getFirstChild().getNodeValue());
}
}
teachers.add(t);
}
System.out.println(teachers);
}
}
 package com.gh.xml;

 import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder; public class JdomDemo {
public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder();// 创建jdom解析器
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("1.xml");
Document doc = sb.build(in);
//拿根元素
Element roote = doc.getRootElement();
//根据根元素拿子元素
List<Element> liste = roote.getChildren();
List<Teacher> teachers=new ArrayList<Teacher>();
Teacher t=null;//注意必须要在里面new,不然teachers添加的都是重复的t;
//遍历子元素,也可以返回一个iterator遍历;
for (int i = 0; i < liste.size(); i++) {
t=new Teacher();
Element e = liste.get(i);
t.setId(Integer.parseInt(e.getAttributeValue("id")));
t.setName(e.getChildText("name"));
teachers.add(t);
}
System.out.println(teachers);
}
}
 package com.gh.xml;

 import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* Dom4j 性能最好
* @author ganhang
*
*/
public class Dom4jDemo {
public static void main(String[] args) throws Exception {
SAXReader sr=new SAXReader();
File f=new File("src/1.xml");
Document doc=sr.read(f);
Element roote=doc.getRootElement();
Iterator<Element> iters=roote.elementIterator();
Teacher t=null;
List<Teacher> list=new ArrayList<Teacher>();
while(iters.hasNext()){
t=new Teacher();
Element e=iters.next();
t.setId(Integer.parseInt(e.attributeValue("id")));
t.setName(e.elementText("name"));
list.add(t);
}
System.out.println(list);
}
}
 package com.gh.xml;

 import java.io.InputStream;

 import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* SAX读xml
* @author ganhang
*
*/
public class SaxDemo {
public static void main(String[] args) throws Exception {
//创建SAX解析器工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
//创建sax解析器
SAXParser sp = spf.newSAXParser();
//用字符流读xml
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("1.xml");
MyHandler dh=new MyHandler();//实例化引擎
//开始解析
sp.parse(is, dh);
System.out.println(dh.getList()); }
}
 package com.gh.xml;

 import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Sax模式的事件处理引擎
* @author ganhang
*
*/
public class MyHandler extends DefaultHandler {
private List<Teacher> list = null;
private Teacher t = null;
private String flag = null;
//开始读入文件
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Teacher>();
}
//开始读元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
flag = qName;
if ("teacher".equals(qName)) {
t=new Teacher();//注意要在这new一个新的Teacher不然list添加会重复
t.setId(Integer.parseInt(attributes.getValue("id")));
//System.out.println(t.getId());
}
}
//读字符数据
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("name".equals(flag)) {
t.setName(new String(ch, start, length));
//System.out.println(t.getName());
}
}
//结束元素时干嘛
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("teacher".equals(qName)) {
list.add(t);
//System.out.println(list.get(0));
}//System.out.println(t);
flag = null;
}
//结束文件时干嘛
@Override
public void endDocument() throws SAXException {
System.out.println("解析成功!");
//System.out.println(list.get(0));
}
public List<Teacher> getList() {
return list;
} }
 package com.gh.xml;

 public class Teacher {
private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
public Teacher() {
super();
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + "]";
}
}
 package com.gh.xml;

 import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* xml和对象之间的转换
* @author ganhang
*
*/
public class ObjectAndXmlDemo {
/**
* 把对象转成xml
* @param obj
* @param file
* @throws Exception
*/
public static void object2xml(Teacher obj,File file) throws Exception{
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
XMLEncoder encode=new XMLEncoder(bos);
encode.writeObject(obj);
encode.flush();
encode.close();
bos.close();
System.out.println("写入成功");
}
/**
* xml转成对象
* @param file
* @return
* @throws Exception
*/
public static Teacher xml2object(File file) throws Exception{
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
XMLDecoder decode =new XMLDecoder(bis);
Teacher t=(Teacher)decode.readObject();
decode.close();
bis.close();
System.out.println("读入成功");
return t;
}
public static void main(String[] args) throws Exception {
//Teacher t=new Teacher(1,"小白");
//object2xml(t,new File("src/2.xml"));
System.out.println(xml2object(new File("src/2.xml")));
}
}

1.xml

 <?xml version="1.0" encoding="UTF-8"?>
<person>
<teacher id="1">
<name>小白</name>
<desc>hehe1</desc>
</teacher> <teacher id="2">
<name>小黑</name>
<desc>hehe2</desc>
</teacher>
<teacher id="3">
<name>小红</name>
<desc>hehe3</desc>
</teacher>
</person>

2.xml

 <?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_79" class="java.beans.XMLDecoder">
<object class="com.gh.xml.Teacher">
<void property="id">
<int>1</int>
</void>
<void property="name">
<string>小白</string>
</void>
</object>
</java>

java学习之xml的更多相关文章

  1. Java学习笔记XML(3)

    XML简介 XML即可扩展的标记语言.因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定. 目前为止所有的标记的语言都属于开源的语言.由W3C组织进行一个基本的维护. 因此大家学习这些 ...

  2. Java学习02-web.xml配置详解

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  3. Java学习笔记--xml构造与解析之Sax的使用

    汇总:xml的构造与解析 http://www.cnblogs.com/gnivor/p/4624058.html 参考资料:http://www.iteye.com/topic/763895 利用S ...

  4. Java学习笔记——XML入门

    以下内容来自网络 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标记语言. XML 的设计宗旨是传输数据,而不是显示 ...

  5. Java学习-023-Properties 类 XML 配置文件读取及写入源代码

    之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFr ...

  6. Java学习笔记(十)——xml

    [前面的话] 学习过程中还是效率不够高,老是容易注意力不集中,着急啊.不能在这样了,要好好学习,好好努力. 学习过程中的小知识点总结,基础知识,选择阅读. [xml定义] 定义:可扩展标记语言(英语: ...

  7. 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  8. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  9. 关于JAVA学习计划和感想

    学习计划第一阶段:    JAVA语言基础知识.包括异常.IO流.多线程.集合类.    要求:异常------掌握try-catch-finally的使用          IO流------掌握字 ...

随机推荐

  1. [Codecademy] HTML&CSS 第三课:HTML Basic II

    本文出自   http://blog.csdn.net/shuangde800 [Codecademy] HTML && CSS课程学习目录 --------------------- ...

  2. uva 11137 Ingenuous Cubrency(完全背包)

    题目连接:11137 - Ingenuous Cubrency 题目大意:由21种规模的立方体(r 1~21),现在给出一个体积, 要求计算可以用多少种方式组成. 解题思路:完全背包, 和uva674 ...

  3. PHP中递归函数的一个常见逻辑问题

    首先.我们得知道递归函数是什么东西.通俗来讲也就是自己调用自己本身的函数. 如今须要设计一段代码.解决1到10叠加的问题. 代码A: <?php //递归函数 $num=10; function ...

  4. 2015腾讯暑期实习生 Web前端开发 面试经历 --作者imwtr

    1.现在有100亿个数字大小为1到10亿的数字,在这100亿个数字里边只有一个数字出现的次数是奇数次的,你用什么方法,找出这个数字呢? 答:显然至少要全部过一遍,可以用位运算,遍历数组,最后剩下的数字 ...

  5. javascript 的工具方法 --- 类型判断

    Javascript中常见类型对象有: Boolean, Number, String, Function, Array, Date, RegExp, Object, Error, Symbol等等. ...

  6. Foundation 框架 NSArray、NSMutableArray排序

    一.使用selector对数组进行排序(无返回) 数组 book 中包含 AddressCard对象. 1.对数组调用 sortUsingSelector方法 -(void) sortByName { ...

  7. python 从数据库表生成model

    python 从数据库表生成model 找了很久才找到这个,我是新手... 现在已有建好的数据库,需要基于原有数据做数据分析的web应用,我选择python+Tornado ,由于不想写SQL语句,就 ...

  8. C# Convert an enum to other type of enum

    Sometimes, if we want to do convert between two enums, firstly, we may think about one way: var myGe ...

  9. 调不尽的内存泄漏,用不完的Valgrind

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-X.X.X.tar.bz2 2. 解压安装包:tar –jxvf ...

  10. JS 深拷贝

    使用递归进行深拷贝 http://lingyu.wang/2014/03/20/js-interview-1/ Object.prototype.deepClone = function() { va ...