XML解析___使用Dom or使用Sax

XML解析___使用Dom or使用Sax

xml解析方式分为两种,domsax

dom(Document Object Model,即对文档对象模型)是W3C组织推荐的处理XML的一种方式

Sax:(Simple API for  XML)不是官方标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它。

 

XML解析开发包

JaxpJdomdom4J

 

使用DOM解析XML介绍

DOM模型(Document Object model

DOM 解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

优点:把xml文件在内存中构造树形结构,可以遍历和修改节点

缺点:如果文件比较大,内存有压力,解析的实际那会比较长

 

使用Dom解析XML的步骤

调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。

	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。

	DocumentBuilder builder = dbf.newDocumentBuilder();

调用Dom解析器对象的parse()方法解析XML文档,得到代表这个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作了。

	Document doc = builder.parse("src/com/demo.xml");//此处填写需要解析的XML的路径

总结:先反射一个解析工厂对象,再通过这个解析工厂对象创建一个Dom解析器对象,再通过Dom解析器对象获得doc文档对象。

 

Dom解析XML实例

(1)给出需要解析的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<employees>
	<employee id="0">
		<name>Alexia</name>
		<age>23</age>
		<sex>Female</sex>
		<weight> 150 </weight>
		<weight><a>160</a></weight>
	</employee>
	<employee id="1">
		<name height="178">Edward</name>
		<age>24</age>
		<sex>Male</sex>
	</employee>
	<employee id="2">
		<name>wjm</name>
		<age>23</age>
		<sex>Female</sex>
	</employee>
	<employee id="3">
		<name>wh</name>
		<age>24</age>
		<sex>Male</sex>
	</employee>
</employees> 
  •  

(2)使用Dom对XML进行解析

 

 

package com.demo;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Domxml {
/*
 *类说明:
 *		使用Dom解析XMl
 *Dom解析XMl的步骤:
 *		1:创建一个dbf工厂对象的对象。
 *		2:通过dbf工厂对象创建一个dom解析器DocumentBuilder对象。
 *		3:通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
 * 
 */
	public static void main(String[] args) throws Exception{
		//1.创建【dbf工厂对象】
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//设置解析器,忽略注释和空格<a>
		dbf.setIgnoringComments(true);
		dbf.setIgnoringElementContentWhitespace(true);
		//2.通过dbf工厂对象获得【Dom解析对象】
		DocumentBuilder builder = dbf.newDocumentBuilder();
		//3。调用DOm解析器对象,解析xml文档,获得[文档Document对象]
		 Document doc = builder.parse("src/conn/demo.xml");//此处填需要解析的xml的路径	
		//获得根节点
		 Element root = doc.getDocumentElement();
		 System.out.println(root.getTagName());//获得节点名字
		 //根据标签名获得节点集合
      	NodeList nodeList = doc.getElementsByTagName("employee");
      		System.out.println("employee节点个数:" + nodeList.getLength());
      	//遍历节点集合
   
      	for(int i = 0;i<nodeList.getLength();i++){
      		Element element =  (Element) nodeList.item(i);//强制转换
      		//获取id属性值
      		String attribute = element.getAttribute("id");
   			System.out.println("id:"+attribute);
   			//获取第一个employee
   	      	if(i==0){
   	      		//获得元素下面的name文本
   	      	System.out.println("name文本值为: "+element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
   	      		//获得元素下面的sex文本
   	      	System.out.println("sex文本值: "+element.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue());
   	      	//获得元素下面的 age文本
	   	 	System.out.println("age文本值: "+element.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
	   	      	//获得元素下面的   weight文本
	   	 	System.out.println("weight文本值: "+element.getElementsByTagName("weight").item(0).getFirstChild().getNodeValue());
   	  //   获得第二个Weight里a标签中的文本值
	   	 	System.out.println(element.getElementsByTagName("weight").item(1).getFirstChild().getFirstChild().getNodeValue());   	
      	}
   	      	System.out.println("");
   	      	System.out.println("");
   	      	System.out.println("");
   	      	System.out.println("");
   	      	
//	    System.out.println("name文本值为: "+element.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
//      		//获得元素下面的age文本
//        System.out.println("sex文本值: "+element.getElementsByTagName("sex").item(i).getFirstChild().getNodeValue());
//	      	//获得元素下面的   文本
//		System.out.println("age文本值: "+element.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
//
//		Element element2 = (Element)nodeList.item(1);
//		String nameValue2 = element2.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
//		String ageValue2 = element2.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
//		String sexValue2 = element2.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue();
//		System.out.println("第二个节点的name文本值:"+nameValue2);
//		System.out.println("第二个节点的age文本值:"+ageValue2);
//		System.out.println("第二个节点的sex文本值:"+sexValue2);
		
	
   		}	
      		
	}
	
}

 得到结果如下:XML解析___使用Dom or使用Sax

使用SAX解析XML介绍

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会对文档当进行处理。

优点:解析可以立即开始,速度快,没有内存压力

缺点:不能对节点做修改

使用SAX解析XML步骤

使用Sax解析XML的准备工作:

1.继承DefaultHandler类:这是解析XML的事件处理基类

2.覆盖statDocument/endDocument,startElement/endElement方法

使用SAXParserFactory创建SAX解析工厂

	SAXParserFactory spf = SAXParserFactory.newInstance();

通过SAX解析工厂得到解析器对象

	SAXParser saxParse = spf.newSAXParser();

通过解析器对象得到一个XML的读取器

XMLRead xmlReader = sp.getXMLReader();

设置读取器的事件处理器

xmlReader.setContentHandler(new BookParserHandler());

解析xml文件

		File file = new File("src/com/demo.xml");
		saxParse.parse(file, new SaxXML());//第二个参数为类名

代码如下:

package com.demo;

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxXml extends DefaultHandler {
	//在解析整个文档开始时调用
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("开始文档! ");
	}
	//在解析整个文档结束时调用
	public void endDocument() throws SAXException{
		System.out.println("结束文档! ");
	}
	//在解析元素开始时被调用 
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println("开始解析元素*************************"+qName);
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		System.out.println("结束文档!");
	}
	public static void main(String[] args) throws Exception, SAXException {
		//1 发射一个Sax解析工厂对象
		SAXParserFactory spf = SAXParserFactory.newInstance();
		//2 创建Sax解析器对象
		SAXParser saxParser = spf.newSAXParser();
		//3 解析xml文件
		File file = new File("src/conn/demo.xml");
		//4.解析XML文件
		saxParser.parse(file,new SaxXml());
	}
	
}

运行结果:

XML解析___使用Dom or使用Sax

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114773.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springmvc源码下载_web系统源码下载

    springmvc源码下载_web系统源码下载Spring源码下载、编译Spring源码下载Spring源码编译1、新增下载源地址2、修改依赖地址三级目录Spring源码下载注意:Spring源码使用的是Gradle,而不是Maven。因此下载Spring源码之前可以先安装Gradle,参考:Gradle的下载、安装和配置环境。Spring源码gitee地址:https://gitee.com/mirrors/Spring-Framework。Spring源码gitee仓库地址:https://gitee.com/mirrors/Spring

    2022年8月12日
    7
  • mysql 错误代码error2003的解决办法

    mysql 错误代码error2003的解决办法出现这种错误一般是mysql服务没有启动,在cmd中输入netstartMySQL就可以启动服务,但是输入之后出现说明没有MySQL这个服务,我们打开计算机管理查找服务,找到MySQL服务,发现服务名是MySQL80(服务名是根据自己电脑中安装的mysql版本),这时候我们点击启动服务,然后在命令行里输入netstartMySQ80,发现还是不行这时候,我们只需要退…

    2022年7月27日
    1
  • QQ自动强制加好友代码

    强行聊天的代码:tencent://Message/?Uin=919433667&amp;websiteName=www.oicqzone.com&amp;Menu=yes强行加好友的代码:tencent://AddContact/fromId=45&amp;fromSubId=1&amp;subcmd=all&amp;uin=574201314&amp;fuin=919433667&amp;w…

    2022年4月6日
    4.7K
  • 点菜宝基站信道设置_点菜宝怎么连接基站

    点菜宝基站信道设置_点菜宝怎么连接基站最近在跟菜鸟天地系统对接,业务中涉及到单点接入,感觉其实现思想很不错,现分享一下,供大家参考:从CP内部系统进入菜鸟天地,也就是从菜鸟的合作伙伴(物流或快递公司内部系统)单点跳转进入菜鸟天地系统红

    2022年8月4日
    37
  • 操作系统进程有若干个状态,若一个进程_进程和线程的概念

    操作系统进程有若干个状态,若一个进程_进程和线程的概念第二章进程管理-进程、线程进程的概念进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。(线程是调度的基本单位)程序:是静态的,是一个存放在磁盘里的可执行文件,是一系列指令的集合进程:是动态的,是程序的一次执行过程

    2022年9月3日
    3
  • 目录层次结构_文件夹构成什么结构

    目录层次结构_文件夹构成什么结构:数码相机/摄像机/图形冲印–:普通数码相机–:专业数码单反–:数码摄像机–:单反镜头–:相机闪光灯及附件–:胶卷相机—-:收藏相机—-:135胶片单反—-:旁轴相机—-:大中幅相机—-:LOMO—-:傻瓜相机—-:一次成像(拍立得)—-:一次性相机—-:特殊相机–:三脚架/云台-…

    2022年10月8日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号