自定义监听器,解析XML文档的步骤实现
程序员文章站
2022-04-21 21:11:38
JAXP的SAX支持SAX解析XML文档需求:解析出firstxml.xml文档的内容思路:在工程中引入Xerces-J集体解析器实现类jar包自定义事件监听器继承自DefaultHandler通过SAXParseFactory的newLnstance()方法创建SAX解析器工厂对象通过SAXParseFactory对象的newSAXParser()方法创建SAXPasrer对象调用SAXParser对象的parse()方法解析XML文档案例练习
JAXP的SAX支持
SAX解析XML文档
需求:解析出firstxml.xml文档的内容
思路:
- 在工程中引入Xerces-J集体解析器实现类jar包
- 自定义事件监听器继承自DefaultHandler
- 通过SAXParseFactory的newLnstance()方法创建SAX解析器工厂对象
- 通过SAXParseFactory对象的newSAXParser()方法创建SAXPasrer对象
- 调用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文档的内容
思路:
- 创建保存xml的结果流对象
- 获取sax生成工厂对象实例
- 获取sax生成处理者对象实例
- 获取sax生成器
- 生成文档以及文档中的元素
案例练习
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