java sax解析器

SAX Parser in java provides API to parse XML documents. SAX parser is different from DOM parser because it doesn’t load complete XML into memory and read xml document sequentially.

Java中的SAX Parser提供了用于解析XML文档的API。 SAX解析器与DOM解析器不同,因为它不会将完整的XML加载到内存中并不会顺序读取xml文档。

SAX解析器 (SAX Parser)

javax.xml.parsers.SAXParser provides method to parse XML document using event handlers. This class implements XMLReader interface and provides overloaded versions of parse() methods to read XML document from File, InputStream, SAX InputSource and String URI.

javax.xml.parsers.SAXParser提供了使用事件处理程序解析XML文档的方法。 此类实现XMLReader接口,并提供parse()方法的重载版本以从File,InputStream,SAX InputSource和String URI读取XML文档。

The actual parsing is done by the Handler class. We need to create our own handler class to parse the XML document. We need to implement org.xml.sax.ContentHandler interface to create our own handler classes. This interface contains callback methods that receive notification when an event occurs. For example StartDocument, EndDocument, StartElement, EndElement, CharacterData etc.

实际的解析由Handler类完成。 我们需要创建自己的处理程序类来解析XML文档。 我们需要实现org.xml.sax.ContentHandler接口来创建我们自己的处理程序类。 此接口包含在事件发生时接收通知的回调方法。 例如StartDocument,EndDocument,StartElement,EndElement,CharacterData等。

org.xml.sax.helpers.DefaultHandler provides default implementation of ContentHandler interface and we can extend this class to create our own handler. It’s advisable to extend this class because we might need only a few of the methods to implement. Extending this class will keep our code cleaner and maintainable.

org.xml.sax.helpers.DefaultHandler提供ContentHandler接口的默认实现,我们可以扩展此类以创建我们自己的处理程序。 建议扩展此类,因为我们可能只需要实现一些方法。 扩展此类将使我们的代码更干净和可维护。

SAX解析器示例 (SAX parser Example)

Let’s jump to the SAX parser example program now, I will explain different features in detail later on.

现在让我们跳到SAX解析器示例程序,稍后我将详细解释不同的功能。

employees.xml

employees.xml

<?xml version="1.0" encoding="UTF-8"?>
<Employees><Employee id="1"><age>29</age><name>Pankaj</name><gender>Male</gender><role>Java Developer</role></Employee><Employee id="2"><age>35</age><name>Lisa</name><gender>Female</gender><role>CEO</role></Employee><Employee id="3"><age>40</age><name>Tom</name><gender>Male</gender><role>Manager</role></Employee><Employee id="4"><age>25</age><name>Meghna</name><gender>Female</gender><role>Manager</role></Employee>
</Employees>

So we have a XML file stored somewhere in file system and by looking at it, we can conclude that it contains list of Employee. Every Employee has id attribute and fields age, name, gender and role.

因此,我们将XML文件存储在文件系统中的某个位置,通过查看它,我们可以得出结论,该文件包含Employee列表。 每个员工都有id属性,并填写agenamegenderrole

We will use SAX parser to parse this XML and create a list of Employee object.

我们将使用SAX解析器来解析此XML并创建Employee对象的列表。

Here is the Employee object representing Employee element from XML.

这是代表XML中的Employee元素的Employee对象。

package com.journaldev.xml;public class Employee {private int id;private String name;private String gender;private int age;private String role;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}@Overridepublic String toString() {return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +" Role=" + this.role;}}

Let’s create our own SAX Parser Handler class extending DefaultHandler class.

让我们创建扩展DefaultHandler类的自己的SAX Parser Handler类。

package com.journaldev.xml.sax;import java.util.ArrayList;
import java.util.List;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import com.journaldev.xml.Employee;public class MyHandler extends DefaultHandler {// List to hold Employees objectprivate List<Employee> empList = null;private Employee emp = null;private StringBuilder data = null;// getter method for employee listpublic List<Employee> getEmpList() {return empList;}boolean bAge = false;boolean bName = false;boolean bGender = false;boolean bRole = false;@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if (qName.equalsIgnoreCase("Employee")) {// create a new Employee and put it in MapString id = attributes.getValue("id");// initialize Employee object and set id attributeemp = new Employee();emp.setId(Integer.parseInt(id));// initialize listif (empList == null)empList = new ArrayList<>();} else if (qName.equalsIgnoreCase("name")) {// set boolean values for fields, will be used in setting Employee variablesbName = true;} else if (qName.equalsIgnoreCase("age")) {bAge = true;} else if (qName.equalsIgnoreCase("gender")) {bGender = true;} else if (qName.equalsIgnoreCase("role")) {bRole = true;}// create the data containerdata = new StringBuilder();}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if (bAge) {// age element, set Employee ageemp.setAge(Integer.parseInt(data.toString()));bAge = false;} else if (bName) {emp.setName(data.toString());bName = false;} else if (bRole) {emp.setRole(data.toString());bRole = false;} else if (bGender) {emp.setGender(data.toString());bGender = false;}if (qName.equalsIgnoreCase("Employee")) {// add Employee object to listempList.add(emp);}}@Overridepublic void characters(char ch[], int start, int length) throws SAXException {data.append(new String(ch, start, length));}
}

MyHandler contains the list of the Employee object as a field with a getter method only. The Employee objects are getting added in the event handler methods. Also, we have an Employee field that will be used to create an Employee object and once all the fields are set, add it to the employee list.

MyHandler仅使用getter方法将Employee对象的列表作为字段包含在内。 Employee对象将添加到事件处理程序方法中。 另外,我们还有一个Employee字段,它将用于创建Employee对象,并且一旦所有字段都设置好,就将其添加到employee列表中。

SAX解析器方法重写 (SAX parser methods to override)

The important methods to override are startElement(), endElement() and characters().

覆盖的重要方法是startElement()endElement()characters()

SAXParser starts parsing the document, when any start element is found, startElement() method is called. We are overriding this method to set boolean variables that will be used to identify the element.

SAXParser开始解析文档,当找到任何开始元素时,将调用startElement()方法。 我们重写此方法来设置将用于标识元素的布尔变量。

We are also using this method to create a new Employee object every time Employee start element is found. Check how id attribute is read here to set the Employee Object id field.

每当找到Employee start元素时,我们还使用此方法创建一个新的Employee对象。 检查此处如何读取id属性以设置Employee Object id字段。

characters() method is called when character data is found by SAXParser inside an element. Note that SAX parser may divide the data into multiple chunks and call characters() method multiple times (Read ContentHandler class characters() method documentation). That’s why we are using StringBuilder to keep this data using append() method.

SAXParser在元素内找到字符数据时,将调用characters()方法。 请注意,SAX解析器可能会将数据分为多个块,并多次调用characters()方法(请参阅ContentHandler类character()方法文档)。 这就是为什么我们使用StringBuilder通过append()方法保留此数据的原因。

The endElement() is the place where we use the StringBuilder data to set employee object properties and add Employee object to the list whenever we found Employee end element tag.

endElement()是我们使用StringBuilder数据设置员工对象属性并将Employee对象添加到列表的地方,只要我们找到Employee结束元素标签即可。

Below is the test program that uses MyHandler to parse above XML to list of Employee objects.

下面是使用MyHandler解析XML到Employee对象列表的测试程序。

package com.journaldev.xml.sax;import java.io.File;
import java.io.IOException;
import java.util.List;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import com.journaldev.xml.Employee;public class XMLParserSAX {public static void main(String[] args) {SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();try {SAXParser saxParser = saxParserFactory.newSAXParser();MyHandler handler = new MyHandler();saxParser.parse(new File("/Users/pankaj/employees.xml"), handler);//Get Employees listList<Employee> empList = handler.getEmpList();//print employee informationfor(Employee emp : empList)System.out.println(emp);} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}}}

Here is the output of the above program.

这是上面程序的输出。

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java Developer
Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEO
Employee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager
Employee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager

SAXParserFactory provides factory methods to get the SAXParser instance. We are passing File object to the parse method along with MyHandler instance to handle the callback events.

SAXParserFactory提供了工厂方法来获取SAXParser实例。 我们将File对象与MyHandler实例一起传递给parse方法,以处理回调事件。

SAXParser is a little bit confusing in the start but if you are working on a large XML document, it provides a more efficient way to read XML than DOM Parser. That’s all for SAX Parser in Java.

首先,SAXParser有点令人困惑,但是如果您正在处理大型XML文档,则它比DOM Parser提供了一种更有效的XML读取方法。 Java的SAX解析器就这些了。

GitHub Repository.GitHub Repository下载该项目。

Reference: SAXParser, DefaultHandler

参考 : SAXParser , DefaultHandler

翻译自: https://www.journaldev.com/1198/java-sax-parser-example

java sax解析器

java sax解析器_Java SAX解析器示例相关推荐

  1. java xml解析器_Java XML解析器

    java xml解析器 Java XML parser is used to work with xml data. XML is widely used technology to transpor ...

  2. java 解析括号_Java如何解析括号中的负数?

    在金融应用中,负数通常用括号表示.在这篇文章中,我们将学习如何解析或转换括号中的负数以产生表示的数字值.要将文本/字符串解析为数字,我们可以使用java.text.DecimalFormat该类. 在 ...

  3. java歌词解析器_JAVA 正则解析歌词

    //目录结构 //来看一下歌词内容 [00:00.00]领袖音乐分享平台 http://www.kugou.com [00:02.31]Pretty boy-M2M 英俊男孩 JY93653制作 [0 ...

  4. java 解析二进制_java实现解析二进制文件(字符串、图片)

    1.需求说明,实现细节要求: 解析二进制文件 files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据 ...

  5. java终结器_Java的终结器仍然存在

    java终结器 当我第一次学习Java并从C ++过渡到Java时,我记得我经常被告知,经常读到它不应该像C ++析构函数那样对待Java终结器,也不应该依靠它. 该建议的频率和坚持性对我产生了影响, ...

  6. java网页解析包_java 网页解析工具包 Jsoup

    Jsoup是一个非常好的解析网页的包,用java开发的,提供了类似DOM,CSS选择器的方式来查找和提取文档中的内容. 相关资料如下: 今天做了一个Jsoup解析网站的项目,使用Jsoup.conne ...

  7. java解析简历_java:解析word文档(前程无忧简历),最好有代码案例?poi或者jacob解析都可以,有jar资源,求急。感谢...

    展开全部 poi读取前程无忧的简历会打不开的,至少我以前读是这样的,因为他有时候是mht文件32313133353236313431303231363533e59b9ee7ad943133336131 ...

  8. java 布局管理器_java布局管理器-borderlayout

    在构造方法中添加代码: 窗口大小 this.setSize(500, 600); 窗口设置borderlayout布局管理器 this.getContentPane().setLayout(new B ...

  9. java 音频播放器_JAVA音频播放器问题

    代码如下,请高手帮忙解决importjava.applet.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.n ...

最新文章

  1. 美国AI博士一针见血:Python这样学最容易成为高手!
  2. 世界创新竞争力发展报告:中美日创新产出竞争力居前三
  3. CVE-2018-8120 Windows权限提升
  4. VS也可以这样进行快捷安装
  5. 微软发招,苹果发飙,React Native躺枪
  6. 【2021.02.09更新】数字信号处理公式推导
  7. 购买阿里云ECS服务器忘记终端管理密码或者没有设置
  8. JAVA入门级教学之(JDK安装-JDK、JRE、JVM)
  9. Redis快速扫描Scan
  10. javascript实现分页效果
  11. mvc5 源码解析2-2 mvchandler的执行
  12. IDEA 日常小技巧
  13. 横向色差测试(LCA)—imatest
  14. 记录微信wxParse的相关代码
  15. 模型预测控制的缺点_模型预测控制(MPC)与最优控制的理论分析 | NeurIPS 2020
  16. 网站视频倍速播放和进度自定义调整
  17. 超详细图文教程·阿里云免费学生ECS云服务器领取并使用全过程(部署Python多人聊天室程序)
  18. linux vi 命令,Linux之VI命令详解
  19. 我的大学-5-34-林陆
  20. 黑猴子的家:Scala 常用类型

热门文章

  1. Git 版本控制 在 WIN 下的一些使用方法
  2. 大型网站首页执行时间0.3秒,性能算好还是算坏?
  3. 在Apache中隐藏Php文件后缀
  4. [转载] python 装饰器
  5. [转载] python---python中时间的应用(time模块)
  6. mysql连接数过多
  7. 手把手教你写一个java的orm(二)
  8. Mac OS 10.12 - 如何关闭Rootless机制?
  9. 限制本机访问某一些网站,本人不再花时间看新闻了
  10. win10计算机用户文件夹改名字怎么改,win10如何改成自己想要的文件夹用户名