您的位置:首页 > 编程语言 > Java开发

java学习之xml

2016-01-24 00:00 369 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: