您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第三季学习笔记-XML
发布时间:2017-08-10 16:20:19编辑:雪饮阅读()
dom解析xml示例:
先在eclipse中项目下的src路径建立person.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<person>
<teacher id="1">
<name>小白</name>
<desc>my name is bai</desc>
</teacher>
<teacher id="2">
<name>小黑</name>
<desc>my name is hei</desc>
</teacher>
</person>
程序入口:DomParseDemo
package com.vince.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.vince.vo.Teacher;
public class DomParseDemo {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建dom解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//通过解析器工厂创建解析器
DocumentBuilder builder = dbf.newDocumentBuilder();
//获取xml文件
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//开始解析
Document doc=builder.parse(is);
List<Teacher> teachers=new ArrayList<Teacher>();
Teacher t=null;
//根据文档的节点获取数据
NodeList nodeList=doc.getElementsByTagName("teacher");
for(int i=0;i<nodeList.getLength();i++){
t=new Teacher();
Node teacherNode=nodeList.item(i);
//获取当前节点的属性
String id=teacherNode.getAttributes().getNamedItem("id").getNodeValue();
System.out.println(id);
t.setId(Integer.parseInt(id));
//获取当前节点下的所有子节点列表
NodeList childNodeList=teacherNode.getChildNodes();
for(int j=0;j<childNodeList.getLength();j++){
//从子节点中取值
Node childNode=childNodeList.item(j);
String tagName=childNode.getNodeName();
if("name".equals(tagName)){
t.setName(childNode.getFirstChild().getNodeValue());
}
if("desc".equals(tagName)){
t.setDesc(childNode.getFirstChild().getNodeValue());
}
}
teachers.add(t);
}
//输出
System.out.println(teachers);
}
}
用到的类:Teacher
package com.vince.vo;
public class Teacher {
private int id;
private String name;
private String desc;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Teacher(int id, String name, String desc) {
super();
this.id = id;
this.name = name;
this.desc = desc;
}
public Teacher() {
super();
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", desc=" + desc + "]";
}
}
SAX解析XML示例:
入口程序:SaxParseDemo
package com.vince.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.vince.vo.Teacher;
public class SaxParseDemo {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建SAX解析器工厂对象
SAXParserFactory factory=SAXParserFactory.newInstance();
//根据工厂创建解析器对象
SAXParser sax=factory.newSAXParser();
//获取文件
InputStream is =Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
PersonHandler ph=new PersonHandler();
//开始解析
sax.parse(is,ph);
//解析完毕,从解析结果中获取一个集合
List<Teacher> list=ph.getTeachers();
System.out.println(list);
}
}
类:PersonHandler
package com.vince.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;
import com.vince.vo.Teacher;
//SAX解析的内容处理器
public class PersonHandler extends DefaultHandler {
private List<Teacher> teachers=null;
private Teacher teacher;
private String tag;
public List<Teacher> getTeachers() {
return teachers;
}
//XML文档开始解析时调用的方法
@Override
public void startDocument() throws SAXException {
teachers=new ArrayList<Teacher>();
}
//解析开始元素时调用的方法
//uri:表示标签的命名空间的名字
//localName:元素名称
//qName:带前缀的元素名称,如“<aa:name>小白</aa:name>”,qName取出的是aa:name
//attributes:属性的集合
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("teacher".equals(qName)){
teacher=new Teacher();
teacher.setId(Integer.parseInt(attributes.getValue("id")));
}
tag=qName;
}
//解析结束元素时调用的方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("teacher".equals(qName)){
//若结束元素标签是teachers,则teachers标签读取完毕,那么就可以将读取完毕的对象加入
//到数组集合中
teachers.add(teacher);
}
tag=null;
}
//解析文本内容时调用的方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag!=null){
if("name".equals(tag)){
//当解析文本内容时则此时肯定是已经读取过该文本节点的直接父级节点的开始元素,
//那么此时tag是已经被赋值了的
teacher.setName(new String(ch,start,length));
}
if("desc".equals(tag)){
teacher.setDesc(new String(ch,start,length));
}
}
}
//XML文档解析完成调用的方法
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("xml解析完毕");
}
}
JDOM解析xml:
下载jdom-2.0.5.zip然后解压得到里面的jdom-2.0.5.jar在我们项目中新建立一个lib目录将jdom-2.0.5.jar放进libs目录,然后添加到编译路径下:
链接:http://pan.baidu.com/s/1nvHpd01 密码:9nfm
添加成功后
会发现生成一个和系统自带的JRE一样的结构出来,而且原jdom-2.0.5.jar也还在的。
jdom解析xml代码示例:
package com.vince.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import com.vince.vo.Teacher;
public class JdomParseDemo {
public static void main(String[] args) throws JDOMException, IOException {
//创建解析器
SAXBuilder builder=new SAXBuilder();
//获取文件
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//开始解析
Document doc=builder.build(in);
//获取根元素
Element root=doc.getRootElement();
//获取根元素下的所有子元素列表
List<Element> list=root.getChildren();
List<Teacher> teachers=new ArrayList<Teacher>();
//遍历
for(int i=0;i<list.size();i++){
Teacher t=new Teacher();
Element e=list.get(i);
String id=e.getAttributeValue("id");
t.setId(Integer.parseInt(id));
t.setName(e.getChildText("name"));
t.setDesc(e.getChildText("desc"));
teachers.add(t);
}
//输出
System.out.println(teachers);
}
}
dom4J解析xml:
解压dom4j-1.6.1.zip取得dom4j-1.6.1.jar同样存放上面jdom-2.0.5.jar之前所在的libs目录中,然后导入即可。
链接:http://pan.baidu.com/s/1nvHpd01 密码:9nfm
代码示例:
package com.vince.xml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.vince.vo.Teacher;
public class Dom4jParseDemo {
public static void main(String[] args) throws DocumentException {
//创建解析器
SAXReader reader=new SAXReader();
//获取文件
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//开始解析
Document doc=reader.read(in);
//获取根节点
Element root= doc.getRootElement();
//获取根元素下的所有子元素列表
Iterator<Element> iters=root.elementIterator();
List<Teacher> list=new ArrayList<Teacher>();
while(iters.hasNext()){
Teacher t=new Teacher();
Element e=iters.next();
t.setId(Integer.parseInt(e.attributeValue("id")));
t.setName(e.elementText("name"));
t.setDesc(e.elementText("desc"));
list.add(t);
}
//输出
System.out.println(list);
}
}
xml与对象相互转换生成:
package com.vince.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;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.vince.vo.Teacher;
public class ObjectAndXmlDemo {
//把对象转换成XML文件
public static void object2XML(File file,Teacher obj) throws IOException{
//文件输出流
OutputStream out=new FileOutputStream(file);
//缓冲输出流
BufferedOutputStream bos=new BufferedOutputStream(out);
//构造一个把对象输出到XML文件中的工具
XMLEncoder encoder=new XMLEncoder(bos);
encoder.writeObject(obj);
encoder.flush();
encoder.close();
bos.close();
out.close();
}
//把xml转换成对象
public static Teacher xml2Object(File file) throws IOException{
//文件输入流
InputStream in=new FileInputStream(file);
//输入缓冲流
BufferedInputStream bis=new BufferedInputStream(in);
//构造一个把xml文件转换成对象的工具
XMLDecoder decoder=new XMLDecoder(bis);
Teacher t=(Teacher)decoder.readObject();
decoder.close();
bis.close();
in.close();
return t;
}
public static void main(String[] args) throws IOException {
//对象转xml
Teacher t=new Teacher(1,"小白","小白老师");
object2XML(new File("D:\\teacher.xml"),t);
System.out.println("对象已经转换成xml");
//xml转对象
t=xml2Object(new File("D:\\teacher.xml"));
System.out.println("xml已经转换成对象");
System.out.println(t);
}
}
关键字词:javase,XML
下一篇:javase第三季学习笔记