解析XML文档

本文介绍了XML文档解析的两种主要方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM是一种将XML文档转换为树形结构的规范,而SAX则采用事件驱动的方式,通过监听XML文档的解析事件来获取信息。SAX解析器在XML文档中行走,遇到关键节点时触发事件,程序员编写事件监听器响应这些事件。文中还提及了JAXP(Java API for XML Parsing),它是JDK的一部分,提供DOM和SAX解析器的工厂类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DOM:Document Object Model:文档对象模型,它是由W3C推荐的处理XML文档规范

SAX:Simple API for XML,是整个XML行业的事实规范

JAXP:Java解析XML文档的API成为JAXP,它k的全称是Java API for XML,JAXP作为JDK的一部分发布,但它仅仅是一些API接口,接口的设计允许应用程序咋子不用的XML解析器之间切换

DocumentBuilderFactory:获取DOM解析工厂类

DocumentBuilder:DOM解析器标准接口

SAXParserFactory:获取SAX解析器的工厂类

SAXParser:SAX解析器标准接口

 

SAX处理机制:

SAX采用事件机制的方式来解析XML文档,这是一种快速读写XML

流程:使用SAX机制解析XML文档时,SAX解析器负责在XML文档中“行走”,每当遇到文档开始、元素开始、文本、元素结束和文档结束时,都将负责向外发送事件,而程序员则负责提供事件监听器来监听这些事件,并通过事件获取XML文档信息

步骤:

 

SAX生成XML文档

BuildXMLMain.java

package com.muke.sax;

import java.io.File;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.helpers.AttributesImpl;

public class BuildXMLMain {

	public static void main(String[] args) throws Exception {
		//创建保存XML的结果流对象
		Result resultXML=new StreamResult(new File("D://firstxml1.xml"));
		//获取sax生成工厂实例
		SAXTransformerFactory saxTransformerFactory=(SAXTransformerFactory) SAXTransformerFactory.newInstance();
		//获取SAX生成处理者对象实例
		TransformerHandler transformerHandler=saxTransformerFactory.newTransformerHandler();
		transformerHandler.setResult(resultXML);
		//获取SAX生成器
		Transformer transformer=transformerHandler.getTransformer();
        //yes表示可以生成空格
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		//生成文档的开始
		transformerHandler.startDocument();
		AttributesImpl attrImpl=new AttributesImpl();
		transformerHandler.startElement("", "", "书籍列表", attrImpl);
		
		transformerHandler.startElement("", "", "计算机书籍", attrImpl);
		transformerHandler.startElement("", "", "书名", attrImpl);
		transformerHandler.characters("Java思想".toCharArray(), 0, "Java思想".length());
		transformerHandler.endElement("", "", "书名");
		
		transformerHandler.startElement("", "", "作者", attrImpl);
		transformerHandler.characters("小王".toCharArray(), 0, "小王".length());
		transformerHandler.endElement("", "", "作者");
		
		transformerHandler.startElement("", "", "价格", attrImpl);
		transformerHandler.characters("79.00".toCharArray(), 0, "79.00".length());
		transformerHandler.endElement("", "", "价格");
		transformerHandler.endElement("", "", "计算机书籍");
		
		//第二本书
		
		transformerHandler.startElement("", "", "计算机书籍", attrImpl);
		transformerHandler.startElement("", "", "书名", attrImpl);
		transformerHandler.characters("Spring指南".toCharArray(), 0, "Spring指南".length());
		transformerHandler.endElement("", "", "书名");
		
		transformerHandler.startElement("", "", "作者", attrImpl);
		transformerHandler.characters("小李".toCharArray(), 0, "小李".length());
		transformerHandler.endElement("", "", "作者");
		
		transformerHandler.startElement("", "", "价格", attrImpl);
		transformerHandler.characters("89.00".toCharArray(), 0, "89.00".length());
		transformerHandler.endElement("", "", "价格");
		transformerHandler.endElement("", "", "计算机书籍");
		
		transformerHandler.endElement("", "", "书籍列表");
		//告诉handler文档生成已结束
		transformerHandler.endDocument();
		
		System.out.println("XML文档生成成功!");
	}

}

SAXParse

package com.muke.sax;

import java.io.IOException;

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

import org.xml.sax.SAXException;

import com.muke.sax.handler.MuKeHandler;

public class SAXParse {

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		//创建SAX解析器工厂
		SAXParserFactory factory= SAXParserFactory.newInstance();
		//创建SAX解析器
		SAXParser parser= factory.newSAXParser();
		//开始解析XML文档
		parser.parse("D://firstxml.xml", new MuKeHandler());
	}

}

MuKeHandler

package com.muke.sax.handler;

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

public class MuKeHandler extends DefaultHandler {
	//定义一个变量来保存当前正在处理的tag
	private String currentTag;
	//每当处理文本数据时将触发该方法
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		 String content=new String(ch,start,length);
		 if (content.trim().length()>0) {
			System.out.println("<"+currentTag+">元素的值是:"+content.trim());
		}
	}
	//解析文档结束时触发该方法
	@Override
	public void endDocument() throws SAXException {
		System.out.println("解析文档结束");
	}
	//解析元素结束时触发该方法
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("处理元素结束:"+qName);
	}
	//每当解析文档开始时触发该方法
	@Override
	public void startDocument() throws SAXException {
		System.out.println("解析文档开始");
	}

	@Override
	public void startElemaent(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.println("开始处理元素:"+qName);
		currentTag=qName;
		if (attributes.getLength()>0) {
			System.out.println("<"+currentTag+">元素的属性如下:");
			for (int i = 0; i < attributes.getLength(); i++) {
				System.out.println(attributes.getQName(i)+"--->"+attributes.getValue(i));
			}
		}
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值