`

j2ee10:xml01:dom解析和sax解析

    博客分类:
  • j2ee
 
阅读更多

第一:基本概念

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();
  }
 }
}

 

  • 大小: 302.8 KB
分享到:
评论

相关推荐

    J2EE中XML配置文件的读取处理

    有好几种XML解析器:主要有DOM和SAX,在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是Sun的JAXP,而其XSL Taglib project中使用Xerces解析器。

    XML Programming Bible

    Chapter 10: Microsoft XML Core Services . . . . . . . . . . . . . . . . Chapter 11: Working with the MSXML DOM . . . . . . . . . . . . . . . Chapter 12: Generating XML from MS Access Data . . . . . . ...

    电子商务网站开发课件新课件(J2EE)

    本课件是自己上课时用的课件,主要介绍J2EE框架概述、XML,以及处理XML的DOM和SAX解析器,JDNI原理,JSP基础知识,标签的原理、编程、配制。SERVLET、EJB原理等

    XML和J2EE的组合技术

    XML的应用似乎是无穷无尽的,但它们大致上可以分为三大类:*简单数据的表示和交换(针对XML的简单API(SAX)和文档对象模型(DOM)语法解析,不同的文档类型定义(DTDs)和概要(schemas))*面向消息的计算(XML-...

    J2EE.v1.3.1.API.chm

    v 1.3 API Specification Compiled to .CHM by 貀vind Stegard Packages javax.activation javax.ejb javax.ejb.spi ...c.dom org.xml.sax org.xml.sax.ext org.xml.sax.helpers

    J2EE(Java EE)技术总结-J2EE学习精华教程-电子书

    .....XML_DOM(文档编程接口之一) .....XML_SAX(文档编程接口之一) .....EJB体系结构 .....会话与消息驱动Bean .....AJAX .....JAXB .....Mail(邮件) .....Security(加密解密) .....mime类型 .....乱码解决方案

    新J2EE Tutorial第四章

    根据新版的J2EE Tutorial翻译的(应用程序服务器8.2),自己做的,希望大家喜欢。目前只有第四章,之后会有第五章SAX,第六章DOM和第七章XSLT。

    Beginning Python (2005).pdf

    02_596543 ftoc.qxd 6/29/05 10:55 PM Page xvii xviii Contents Putting It All Together with Extreme Programming 199 Implementing a Search Utility in Python 200 Try It Out: Writing a Test Suite First ...

    java面试题

    SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty 设置JavaBean属性 jsp:getProperty 输出JavaBean属性 jsp:...

    超级有影响力霸气的Java面试题大全文档

    10、说出ArrayList,Vector, LinkedList的存储性能和特性  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及...

    java 面试题 总结

    10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别...

    JAVA SE学习精华集锦

    1 JAVA SE 2 1.1 深入JAVA API 2 1.1.1 Lang包 2 ...3.7 Java与XML联合编程之SAX篇 154 3.8 Java与XML联合编程之DOM篇 159 4 其他 165 4.1 代码复用的规则 165 4.2 Java IO 包中的Decorator模式 168

    (超赞)JAVA精华之--深入JAVA API

    1 JAVA SE 1.1 深入JAVA API 1.1.1 Lang包 1.1.2 集合类 1.1.2.1.1 日期类Date ...3.7 Java与XML联合编程之SAX篇 3.8 Java与XML联合编程之DOM篇 4 其他 4.1 代码复用的规则 4.2 Java IO 包中的Decorator模式

    cemicursoj2ee:从 code.google.compcemicursoj2ee 自动导出

    XML(架构、DTD)和 JAXP(DOM 和 SAX)(.) 代码文档 (javadoc) 测试:JUnit、JMeter、... 介绍以下概念 小程序 并发 (.) 网络(. - 示例) Swing (. - 示例) RMI (.) 序列化和反射 (.) XSLT 和 XPath ...

    resume:这是约翰娜·马克·史密斯(Johnathan Mark Smith)的在线简历。 Johnathan Mark Smith是一名架构师高级程序员,与Spring,Java,Hibernate和Maven一起工作。

    Johnathan Mark Smith-简历客观的超过29年的专业于业务技术的经验。 我对使用领先技术和Web应用程序服务器... JUnit, Struts 1 & 2, AJAX, DOM, Dojo, DHML, XML, J2EE, JSP, JSF, JME, JDBC, JSON, JQuery, PHP, SAX,

    restlet-jee-2.1.1.zip

    Restlet API包括一些能够创建基于字符串、文件、流(stream)、通道(channel)及XML文档的表示(representation),它支持SAX、DOM及XSLT。使用FreeMaker或Apache Velocity模板引擎,你可以很容易地创建基于JSP式...

    系统分析师考试复习资料

    ............................................................................................................8 什么类型的SAX 事件被SAX 解析器抛出了哪?...................................................

Global site tag (gtag.js) - Google Analytics