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. UltraISO做U盘启动盘教程

    用UltraISO做U盘启动盘教程 注意:制作前请先备份u盘内重要文件 vista.win7系统需要以管理员身份运行UltraISO,其他系统直接运行即可 1.打开UltraISO选择iso镜像文件 ...

  2. JS中的replace方法

    JavaScript中replace() 方法如果直接用str.replace("-","!") 只会替换第一个匹配的字符. 而str.replace(/\-/ ...

  3. HDU OJ 5441 Travel 2015online E

    题目:click here 题意: 有个很暴躁的人,想坐车旅行n个城市.连接城市共有m条路(双向).他坐在车上很不爽,每次最多忍耐x分钟.但是每站下车他又可以休息(重新计时).总共有q次询问.问途中有 ...

  4. c++ primer plus 习题答案(2)

    p221.8 #include<iostream> #include<cstdlib> #include<cstring> using namespace std; ...

  5. Android 开发笔记 “The constructor AlertDialog.Builder(new View.OnKeyListener(){}) is undefined”

    1.The constructor AlertDialog.Builder(new View.OnKeyListener(){}) is undefined等,应该有很多类似问题 比如你的源码文件名是 ...

  6. 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)

    五.数据运算与数据运算符 1.算术运算符 算术运算符 运算符 描述 示例 + 加法 >>> 14 - 5 9 - 减法 >>> 14 - 5 9  *  乘法 &g ...

  7. The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2.(不能包含中文路径,qmake够弱智的)

    打开某个项目的时候,编译出现类似的错误 21:46:44: The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2. ...

  8. Sublime Text 2 - There are no packages available for installation

    解决Sublime Text 2 package Control 无法安装插件的问题 错误提示 here are no packages available for installation 问题解决 ...

  9. Convert Sorted List to Binary Search Tree ------C++ 递归创建平衡二叉查找树

    有序链表 0->1->2->3->4->5 转换为一个二叉排序树.我们在此创建一个平衡二叉排序树 1.先找链表到中间的节点 2.中间节点的val创建一个新的树节点Tree ...

  10. 自己定义View----点击滑动选择字母列表

    因为项目须要,也不想使用网上的写好的控件,于是作死的自己定义了一个控件.特此记录下成功.效果例如以下: 首先须要把全部的字母绘制出来: private static String letters[] ...