自定义监听器,解析XML文档的步骤实现

2022-07-27,,,,

JAXP的SAX支持

SAX解析XML文档

需求:解析出firstxml.xml文档的内容

思路:

  1. 在工程中引入Xerces-J集体解析器实现类jar包
  2. 自定义事件监听器继承自DefaultHandler
  3. 通过SAXParseFactory的newLnstance()方法创建SAX解析器工厂对象
  4. 通过SAXParseFactory对象的newSAXParser()方法创建SAXPasrer对象
  5. 调用SAXParser对象的parse()方法解析XML文档

案例练习

<?xml version="1.0" encoding="UTF-8"?>
<书籍列表>
	<计算机书籍>
		<书名>Java</书名>
		<作者>Kilig</作者>
		<价格>23.5$</价格>
	</计算机书籍>
	<计算机书籍>
		<书名>C++</书名>
		<作者>Berry</作者>
		<价格>17.5$</价格>
	</计算机书籍>
</书籍列表>

首先加入我们的jar包,一会儿我回上传到资源处,然后右键Build Path

然后创建类,开始编写

此处需要我们创建类,需要注意新类所继承

在这儿我们需要重写一些方法:

1.ASXParse.java

package com.kilig.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.kilig.sax.header.Kilig;

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("/Users/kilig/Desktop/firstxml.xml", new Kilig());
		
	}

}

2.Kilig.java

package com.kilig.sax.header;

import javax.swing.plaf.synth.SynthOptionPaneUI;

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

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

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		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));
			}
		}
	}

	

}

运行看一看


SAX生成XML文档

需求:生成出firstxml.xml文档的内容

思路:

  1. 创建保存xml的结果流对象
  2. 获取sax生成工厂对象实例
  3. 获取sax生成处理者对象实例
  4. 获取sax生成器
  5. 生成文档以及文档中的元素

案例练习

package com.kilig.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.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributeListImpl;
import org.xml.sax.helpers.AttributesImpl;

public class BuildXMLMain {

	public static void main(String[] args) throws TransformerConfigurationException, SAXException {
		// TODO Auto-generated method stub
//		创建保存XML的结果流对象
		Result resultXML =new StreamResult(new File("/Users/kilig/Desktop/firstxml2.xml"));
//		获取sax生成工厂实例
		SAXTransformerFactory saxTransformerFactory =(SAXTransformerFactory) SAXTransformerFactory.newInstance();
//		获取SAX生成处理者对象实例
		TransformerHandler transformerHandler =saxTransformerFactory.newTransformerHandler();
		transformerHandler.setResult(resultXML);
//		获取SAX生成器
		Transformer trnaTransformr =transformerHandler.getTransformer();
		((Transformer) transformerHandler).setOutputProperty(OutputKeys.INDENT, "yes");
//		生成文档的开始
		transformerHandler.startDocument();
		AttributeListImpl attrlmpl =new AttributeListImpl();
		transformerHandler.startElement("", "", "书籍列表", (Attributes) attrlmpl);
//		第一本
		transformerHandler.startElement("", "", "计算机书籍", (Attributes) attrlmpl);
		transformerHandler.startElement("", "", "书名", (Attributes) attrlmpl);
		transformerHandler.characters("Java".toCharArray(), 0, "Java".length());
		transformerHandler.endElement("", "", "书名");
		
		transformerHandler.startElement("", "", "作者", (Attributes) attrlmpl);
		transformerHandler.characters("Kilig".toCharArray(), 0, "kilig".length());
		transformerHandler.endElement("", "", "作者");
		
		transformerHandler.startElement("", "", "价格", (Attributes) attrlmpl);
		transformerHandler.characters("25.8$".toCharArray(), 0, "25.8$".length());
		transformerHandler.endElement("", "", "价格");
		transformerHandler.endElement("", "", "计算机书籍");
//		第二本
		transformerHandler.startElement("", "", "计算机书籍", (Attributes) attrlmpl);
		transformerHandler.startElement("", "", "书名", (Attributes) attrlmpl);
		transformerHandler.characters("C++".toCharArray(), 0, "C++".length());
		transformerHandler.endElement("", "", "书名");
		
		transformerHandler.startElement("", "", "作者", (Attributes) attrlmpl);
		transformerHandler.characters("Berry".toCharArray(), 0, "Berry".length());
		transformerHandler.endElement("", "", "作者");
		
		transformerHandler.startElement("", "", "价格", (Attributes) attrlmpl);
		transformerHandler.characters("16.5$".toCharArray(), 0, "16.5$".length());
		transformerHandler.endElement("", "", "价格");
		transformerHandler.endElement("", "", "计算机书籍");
		
		transformerHandler.endElement("", "", "书籍列表");
//		告诉Handler文档生成结束
		transformerHandler.endDocument();
		System.out.println("XML文档生成成功!!!");
	}

}

 

 

 

 

本文地址:https://blog.csdn.net/Slovenia_groot/article/details/110224052

《自定义监听器,解析XML文档的步骤实现.doc》

下载本文的Word格式文档,以方便收藏与打印。