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. C# 对象拷贝问题 =等同于浅拷贝

    大家都知道,在C#中变量的存储分为值类型和引用类型两种,而值类型和引用类型在数值变化是产生的后果是不一样的,值类型我们可以轻松实现数值的拷贝,那么引用类型呢,在对象拷贝上存在着一定的难度.     下 ...

  2. Random类短时间大量随机重复的问题

    先声明一下,我是在那篇文章上看到的解决方法: http://dl.download.csdn.net/down10/20141103/4b173214e41ff3207305c2470524b0f3. ...

  3. 在C语言中基本数据类型所占的字节数

    基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...

  4. jbpmAPI-6

    第六章流程. 6.1. What is BPMN 2.0 业务流程模型和符号(BPMN)2.0规范是OMG规范,不仅定义了一个标准的业务流程的图形化表述(如BPMN 1. x),但现在还包括执行语义定 ...

  5. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  6. 【转】IOS 输入框被键盘遮盖的解决方法

    做IOS开发时,难免会遇到输入框被键盘遮掩的问题.上网上搜索了很多相关的解决方案,看了很多,但是由衷的觉得太麻烦了. 有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollVi ...

  7. 菜农群课笔记之ICP与ISP----20110412(整理版)

    耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html        成 ...

  8. WINDOWS硬件通知应用程序的常方法

    摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口.为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,并 ...

  9. 在systemd(CentOS7)自启动zookeeper

    zookeeper的自启动脚本,如果是 sysV 模式(CeontOS6或以下版本),可以直接使用下载版本中的 src 目录下对应的 sysV 自启动包,再chkconfig即可.老方法,简单,就不说 ...

  10. Clojure绘制UML

    简单介绍 使用Clojure封装了Graphviz的使用.眼下主要实现了UML的绘制 使用 以命令模式的UML为例,演示cdraw的使用 安装Graphviz cdraw是对Graphviz的简单封装 ...