第一:基本概念
1.xml是可扩展的标记语言(他可以让程序员自己定义标签),提供了一套跨平台、跨网络、跨程序的语言的数据描述方式,
使用xml可以方便的实现数据交换、系统配置、内容管理等常见功能
2.html和xml的不同点:html中的元素是固定的,并且以显示为主。xml语言中的标签都是由用户定义的,主要以数据保存为主。
-------------------------------
3.什么是xml:
答:第一:xml可以清晰的描述出数据的保存结构。第二:在xml中的组成部分:头信息、数据区
xml可以使用dom读取或者输出xml文件
4.什么是xml解析:
答:所有的xml文件都是由节点保存内容的,所谓的解析操作就是指从指定的节点之中将内容读取出来。xml是描述(保存)内容,xml解析是读取内容
5.在xml解析中w3c定义了sax和dom两种解析方式:xml文件-->xml解析器-->dom接口或者sax接口-->xml应用程序
这两种w3c标准解析中,以dom为主。
6.dom解析是文档对象模型(也就是个树形结构),也就是xml本身是以树状结构出现的。
----------------------------------------------------------------------------------------------------
上课:
1.Html:是实现网页ui的标记语言
Xml:跟Html类似,也是由标签构成内容的文件<x></x>,并且符合dom树(dom规范)。不同的地方是在xml中所有的标签由程序员自己定义。
2.作用:
----用一种定义好的标准结构描述(保存)数据。完成不同平台不同系统之间的数据的交互。
----用来配置项目(对项目中的数据进行描述)
3.isbn是属性,虽然放在属性的位置了,但也相当于一个列
4.dom解析:解析就是完成数据的交互。
--1.获得解析器工厂,2,通过工厂获得解析对象,3.通过解析器对象解析xml文件后获得文档的跟节点也就是document,4.根据文档跟节点document获得元素的跟节点
----DocumentBuilderFactory类是个抽象的类而且构造方法是受保护的,不能被实例化,因此需要需要使用静态方法获取对象。由于是抽象的,因此引用的是子类对象
----DocumentBuilder类也是抽象的
----解析parse完成之后,就能够获得整个document对象。Document是个接口,表示整个html或者xml。(因为这两个都符合dom树)
----getDocumentElement是获得元素(这样通过document文档找到了元素的跟节点)。这个方法由document调用
----getTextContent方式是获得两个节点之间的内容。(注意是两个标签之间的)
----注意:1.Document继承node。
---2.元素跟节点的区别:Element继承Node接口,因此经常使用node接口的属性来获取元素element中的所有属性的集合。元素指的是每个标签。节点的范围比元素的范围大,除了标签之外,标签之间围堵的内容也是节点(文本节点),空白(换行)也是,所以是继承关系
---3.当找到类型为1的节点的时候,表示是元素节点,元素节点的NodeValue方法的值是null,因此使用元素节点的getTextContent方法获取该元素节点所围堵的文本节点的内容。
特点:在解析的时候需要一次加载整个xml文档形成dom树,此时有了dom树就获得了document对象。
当文档数据量大的时候,导致速度慢、需要较大的内存资源、不能改变内容(只是改变内存中的内容了,不能改变物理文件)。
5.sax解析:解决上面的问题
特点:sax的意思是simple api for Xml:操作xml 的简单接口。sax与dom不同的是,sax采用一种顺序的方式进行访问,是一种快速夺取xml的方式。当加载文档的时候遇到文档的开始结束,标签的开始结束的时候就会就会调用
相关的处理方法。
回调方法:当对象被调用的时候,该对象里面的方法会自动被执行,不用我们调用,也不用我们传参。
----sax解析是基于事件驱动模型的解析(也就是说程序是由用户的操作引起程序的下一步执行。sax认为碰到(加载)一个文档就触发了一个事件,也就是startDocument方法等,每一个节点都会触发一个事件。
解析完成之后,该节点将在内存中删除)
-----不能对内容做修改,只能读取(因为加载之后会被删掉)
1.加静态代码块
2.从xml中解析出来之后封装到对象里
3.通过反射获得对象,然后获得所有属性,在然后把属性名变成setXxxxx
------------------------
李兴华视频2:
1.Element是Node接口的实例
2.nodelist.item(0).getFirstChild().getNodeValue()是获得节点集合中的第一个元素的第一个孩子的值。
第二:代码实现
1.dom解析
package com.dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomTest {
public static void main(String[] args) {
try {
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//创建解析器工厂对象
DocumentBuilder db = dbf.newDocumentBuilder();//创建解析器对象
Document doc = db.parse("book.xml");//解析xml文件,获得xml文件的跟节点,获得跟节点也就获得了所有的节点
Element eleList=doc.getDocumentElement();//获得根标签stulist
//System.out.println(eleList.getNodeName()+" "+eleList.getNodeType()+" "+eleList.getNodeValue());
NodeList nlist=eleList.getChildNodes();//获得跟标签下面的子节点student,相当于几个学生对象
for(int x=0;x<nlist.getLength();x++){
Node n=nlist.item(x);//获得每个学生对象
if(n.getNodeType()==1){//如果是标签(元素)节点,说明不是换行
NodeList nodelist=n.getChildNodes();//获得每个属性
for(int y=0;y<nodelist.getLength();y++){//遍历属性
Node node=nodelist.item(y);
if(node.getNodeType()==1){
System.out.print(node.getTextContent()+"\t");//获得该标签节点所围堵的内容
}
}
System.out.println();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.sax解析
(1).实体类
package com.entity;
public class Student5 {
private int sno;
private String sname;
private int sage;
private String ssex;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Student5(int sno, String sname, int sage, String ssex) {
super();
this.sno = sno;
this.sname = sname;
this.sage = sage;
this.ssex = ssex;
}
public Student5() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "student5 [sno=" + sno + ", sname=" + sname + ", sage=" + sage
+ ", ssex=" + ssex + "]";
}
}
(2).公共方法
package com.comm;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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.entity.Student5;
//自定义的解析器
public class BaseDao extends DefaultHandler{
String tagName;
String DRIVER,URL,UNAME,PWD;
Connection conn=null;
PreparedStatement pstat=null;
ResultSet rs=null;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
List<Student5> ls=this.search();
for(Student5 stu:ls){
System.out.println(stu);
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
tagName=qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
tagName="";
if(qName.equals("student")){//每写完一个对象
System.out.println();//换行
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
if(tagName.equals("DRIVER")){
DRIVER=String.valueOf(ch,start,length);//获得文本内容
//System.out.print(str+"\t");
System.out.println(DRIVER);
}
if(tagName.equals("URL")){
URL=String.valueOf(ch,start,length);//获得文本内容
System.out.println(URL);
}
if(tagName.equals("UNAME")){
UNAME=String.valueOf(ch,start,length);//获得文本内容
System.out.println(UNAME);
}
if(tagName.equals("PWD")){
PWD=String.valueOf(ch,start,length);//获得文本内容
System.out.println(PWD);
}
}
private Connection getConnection(){
try {
Class.forName(DRIVER);
System.out.println("连接成功");
conn=DriverManager.getConnection(URL,UNAME,PWD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
private List<Student5> search(){
Student5 s=null;
List<Student5> liststu=new ArrayList<Student5>();
try {
this.getConnection();
String sql="select * from student5";
pstat=conn.prepareStatement(sql);
rs=pstat.executeQuery();
while(rs.next()){
s=new Student5();
s.setSname(rs.getString("sname"));
liststu.add(s);
}
System.out.println("集合 的长度"+liststu.size());
} catch (Exception e) {
e.printStackTrace();
}
return liststu;
}
}
(3).调用过程
package com.comm;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest {
public static void main(String[] args) {
try {
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
sp.parse("src/pro.xml", new BaseDao());
} catch (Exception e) {
e.printStackTrace();
}
}
}