javaweb学习总结十二(JAXP对XML文档进行SAX解析)

时间:2022-09-02 16:13:13

一:JAXP使用SAX方式解析XML文件

1:dom解析与sax解析异同点

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

2:sax解析特点

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

二:代码案例

1:xml文件

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student>
<name sid="111">李四</name>
<age>23</age>
<gender>男</gender>
</student>
<student>
<name sid="222">张三</name>
<age>21</age>
<gender>女</gender>
</student>
</students>

2:测试主体部分

 @Test
public void testParseXml() throws ParserConfigurationException,
SAXException, IOException {
// 1:获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2:获取解析器
SAXParser parser = factory.newSAXParser();
// 3:获取读取器
XMLReader reader = parser.getXMLReader();
// 4:设置内容格式
reader.setContentHandler(new GetSecondNameHandler());
// 5:解析文件
reader.parse("xml/exam.xml");
}

a:获取整个xml文档标签的处理事件

 // 定义一个解析全文的解析器
class MyHandler implements ContentHandler { @Override
public void setDocumentLocator(Locator locator) { } @Override
public void startDocument() throws SAXException { } @Override
public void endDocument() throws SAXException { } @Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException { } @Override
public void endPrefixMapping(String prefix) throws SAXException { } @Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<" + qName + ">");
// 获取元素的属性
for (int i = 0; i < atts.getLength(); i++) {
String attrName = atts.getQName(i);
String attrValue = atts.getValue(i);
System.out.println(attrName + "=" + attrValue);
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("<" + qName + "/>");
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch, start, length));
} @Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException { } @Override
public void processingInstruction(String target, String data)
throws SAXException { } @Override
public void skippedEntity(String name) throws SAXException { } }

b:定义“获取指定内容,获取第二个学生的名字”事件

 class GetSecondNameHandler extends DefaultHandler {

     private String contentTag;
private int currentTag = 0;
private int getTag = 2; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
contentTag = qName;
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
contentTag = null;
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("name".equals(contentTag)) {
currentTag++;
if (currentTag == getTag) {
System.out.println(new String(ch, start, length));
} }
} }

c:将xml信息封装成javabean对象,然后放到list集合中

 / 将xml中student元素内容封装成对象,然后放到list集合中
class BeanListHandler extends DefaultHandler {
private List<Student> list = new ArrayList<Student>();
private String tagName;
private Student stu; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = qName;
if ("student".equals(tagName)) {
stu = new Student();
}
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException { if ("name".equals(tagName)) {
stu.setName(new String(ch, start, length));
}
if ("age".equals(tagName)) {
stu.setAge(Integer.parseInt(new String(ch, start, length)));
}
if ("gender".equals(tagName)) {
stu.setGender(new String(ch, start, length));
} } @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("student".equals(qName)) {
list.add(stu);
stu = null;
} tagName = null;
} public List<Student> getStudents() {
return list;
} }

测试程序代码修改为:

 @Test
public void testParseXml() throws ParserConfigurationException,
SAXException, IOException {
// 1:获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2:获取解析器
SAXParser parser = factory.newSAXParser();
// 3:获取读取器
XMLReader reader = parser.getXMLReader();
// 4:设置内容格式
BeanListHandler beanListHandler = new BeanListHandler();
reader.setContentHandler(beanListHandler);
// 5:解析文件
reader.parse("xml/exam.xml"); List<Student> list = beanListHandler.getStudents();
for (Student stu : list) {
System.out.println("name=" + stu.getName() + " age=" + stu.getAge()
+ " gender=" + stu.getGender());
}
}

javaweb学习总结十二(JAXP对XML文档进行SAX解析)的更多相关文章

  1. 2&period;2 使用 JAXP 对XML文档进行SAX解析

    使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...

  2. 2&period;1 使用JAXP 对 xml文档进行DOM解析

    //使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...

  3. javaweb学习总结十三&lpar;dom4j方式对XML文档进行解析以及Xpath的使用&rpar;

    一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ...

  4. 使用JAXP对xml文档进行DOM解析基础

    XML解析方式分为两种:dom和sax         dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式.       sax: ...

  5. 使用JAXP对XML文档进行DOM解析

    import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers. ...

  6. javaweb学习总结十一&lpar;JAXP对XML文档进行DOM解析&rpar;

    一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) @Test // 向元素中添加节点<version>1.0& ...

  7. XML学习笔记(四)-- 修饰XML文档的CSS

    标签(空格分隔): 学习笔记 XML为存储结构化数据提供了强大的方法,但是它没有提供关于数据如何显示地信息,(数据的结构与数据表示无关).可以使用CSS来控制XML文档中各元素的呈现方式. CSS语法 ...

  8. 源生API解析XML文档与dom4j解析XML文档

    一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...

  9. xml文档读取-SAX

    由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持: SAX,全称Simple API ...

随机推荐

  1. 怎么计算Oracle的表一条记录占用空间的大小

    如何计算Oracle的表一条记录占用空间的大小? 如何计算Oracle的表记录占用空间的大小? 是把所有字段的大小都加起来吗?varchar(256),char,number算几个字节? ------ ...

  2. Azure Blob Storage从入门到精通

    今天推荐的是一个系列文章,让读者阅读完成后可以对Azure Blob Storage的开发有一个全面的了解,可谓是从入门到精通. Azure在最初的版本里面就提供了非结构化数据的存储服务,也即Blob ...

  3. Windows 消息机制详解

    总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置   关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...

  4. Oracle 简介 三层结构

    引言: 主流数据库:sql server, oracle, my sql,IBM公司的DB2 ,oracle占有量很大 dbms(database management system)数据库管理系统 ...

  5. 使用POI 导入excel

    引言:最近一直在接触excel的问题,网页也有很多关于POI解析excel的资料,我也简单的整理了下,有不对地方的还望及时指正,渴望与大家交流并学习. public int importExcel(F ...

  6. NGINX下配置CACHE-CONTROL

    HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括no-c ...

  7. C&num; Note30: 网络爬虫

    用C#实现网络爬虫(一) 用C#实现网络爬虫(二) 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看) 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网) C#获取网页内容的三种方式

  8. 经典论文翻译导读之《Google File System》&lpar;转&rpar;

    [译者预读] GFS这三个字母无需过多修饰,<Google File System>的论文也早有译版.但是这不妨碍我们加点批注.重温经典,并结合上篇Haystack的文章,将GFS.TFS ...

  9. python3解析库pyquery

    pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语 ...

  10. Jump Game - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Jump Game - LeetCode 注意点 解法 解法一:贪心算法,只关注能到达最远距离,如果能到达的最远距离大于结尾说明能到达,否则不能.并且如果 ...