Java SAX剖析机制为我们供应了一系列的API来处置惩罚XML文件,SAX剖析和DOM剖析体式格局不太一样,它并非將XML文件内容一次性悉数加载,而是一连的部份加载。
javax.xml.parsers.SAXParser
类供应了一些函数,采纳事宜处置惩罚体式格局剖析XML文档,这个类完成了XMLReader接口,供应了重载的parse()要领从File,InputStream,SAX InputSource和URI字符串中读取XML文档。
现实的XML剖析事情由Handler类来完成,我们须要建立本身的Handler类,这就须要我们完成org.xml.sax.ContentHandler
接口。这个接口中包括当事宜发作时吸收关照的回调要领,比方 StartDocument, EndDocument, StartElement, EndElement, CharacterData等等。
org.xml.sax.helpers.DefaultHandler
供应了ContentHandler接口的默许完成,因而我们能够继续该类完成本身的处置惩罚类。继续这个类是明智的挑选,由于我们能够只须要完成一些要领。继续这个类能够保证代码的简约和可维护性。
下面是我们要剖析的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>
该XML文件内容寄存一些员工的信息,每一个员工包括id属性和age, name, gender,role字段。
我们將运用SAX剖析机制处置惩罚XML文件并建立员工对象列表。
我们运用Employee类笼统员工的信息:Employee.java
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; } @Override public String toString() { return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role; } }
接着继续DefaultHandler类建立本身的Handler类MyHandler.java
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 object private List<Employee> empList = null; private Employee emp = null; //getter method for employee list public List<Employee> getEmpList() { return empList; } boolean bAge = false; boolean bName = false; boolean bGender = false; boolean bRole = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("Employee")) { //create a new Employee and put it in Map String id = attributes.getValue("id"); //initialize Employee object and set id attribute emp = new Employee(); emp.setId(Integer.parseInt(id)); //initialize list if (empList == null) empList = new ArrayList<>(); } else if (qName.equalsIgnoreCase("name")) { //set boolean values for fields, will be used in setting Employee variables bName = true; } else if (qName.equalsIgnoreCase("age")) { bAge = true; } else if (qName.equalsIgnoreCase("gender")) { bGender = true; } else if (qName.equalsIgnoreCase("role")) { bRole = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("Employee")) { //add Employee object to list empList.add(emp); } } @Override public void characters(char ch[], int start, int length) throws SAXException { if (bAge) { //age element, set Employee age emp.setAge(Integer.parseInt(new String(ch, start, length))); bAge = false; } else if (bName) { emp.setName(new String(ch, start, length)); bName = false; } else if (bRole) { emp.setRole(new String(ch, start, length)); bRole = false; } else if (bGender) { emp.setGender(new String(ch, start, length)); bGender = false; } } }
MyHandler类持有一个寄存Employee对象的List援用,它只要一个对应的getter要领。Employee对象在事宜处置惩罚函数中被添加到List对象,在MyHandler类中还定义了Employee对象和它的几个字段相干的boolean范例变量用于建立Employee对象,当Employee对象的一切属性都被设置时,它就会被添加到list中。
我们重写了几个主要的要领startElement(), endElement() 和characters().
当SAXParser 最先剖析文档时碰到元素的最先标签时,startElement() 要领就会被挪用,我们重写了这个要领,运用boolean范例变量来辨别元素种别。我们也是在该要领中,当Employee 标签最先时建立Employee 对象。
当SAXParser碰到元素中的字符串数据时characters()要领会被挪用,我们运用boolean范例字段为Employee对象的属性举行赋值。
endElement()要领则会在SAXParser 碰到XML完毕标签时会被挪用,在这里我们將Employee对象添加到List对象中。
鄙人面的测试顺序中,我们运用MyHandler剖析XML文档生成寄存Employee 对象List。
XMLParserSAX.java
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 list List<Employee> empList = handler.getEmpList(); //print employee information for(Employee emp : empList) System.out.println(emp); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
运转顺序输出:
Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=ManagerEmployee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager
SAXParserFactory 类供应了工场要领来猎取SAXParser 实例,在挪用 SAXParser对象的parse要领时传入Handler对象来处置惩罚回调事宜。SAXParser剖析机制刚最先打仗时有点庞杂,然则当你致力于处置惩罚大型的XML文档时,它比DOM剖析供应了更有用的剖析机制。
原文地点:http://www.ki4.cn/
Java SAX剖析机制为我们供应了一系列的API来处置惩罚XML文件,SAX剖析和DOM剖析体式格局不太一样,它并非將XML文件内容一次性悉数加载,而是一连的部份加载。
javax.xml.parsers.SAXParser
类供应了一些函数,采纳事宜处置惩罚体式格局剖析XML文档,这个类完成了XMLReader接口,供应了重载的parse()要领从File,InputStream,SAX InputSource和URI字符串中读取XML文档。
现实的XML剖析事情由Handler类来完成,我们须要建立本身的Handler类,这就须要我们完成org.xml.sax.ContentHandler
接口。这个接口中包括当事宜发作时吸收关照的回调要领,比方 StartDocument, EndDocument, StartElement, EndElement, CharacterData等等。
org.xml.sax.helpers.DefaultHandler
供应了ContentHandler接口的默许完成,因而我们能够继续该类完成本身的处置惩罚类。继续这个类是明智的挑选,由于我们能够只须要完成一些要领。继续这个类能够保证代码的简约和可维护性。
下面是我们要剖析的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>
该XML文件内容寄存一些员工的信息,每一个员工包括id属性和age, name, gender,role字段。
我们將运用SAX剖析机制处置惩罚XML文件并建立员工对象列表。
我们运用Employee类笼统员工的信息:Employee.java
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; } @Override public String toString() { return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role; } }
接着继续DefaultHandler类建立本身的Handler类MyHandler.java
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 object private List<Employee> empList = null; private Employee emp = null; //getter method for employee list public List<Employee> getEmpList() { return empList; } boolean bAge = false; boolean bName = false; boolean bGender = false; boolean bRole = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("Employee")) { //create a new Employee and put it in Map String id = attributes.getValue("id"); //initialize Employee object and set id attribute emp = new Employee(); emp.setId(Integer.parseInt(id)); //initialize list if (empList == null) empList = new ArrayList<>(); } else if (qName.equalsIgnoreCase("name")) { //set boolean values for fields, will be used in setting Employee variables bName = true; } else if (qName.equalsIgnoreCase("age")) { bAge = true; } else if (qName.equalsIgnoreCase("gender")) { bGender = true; } else if (qName.equalsIgnoreCase("role")) { bRole = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("Employee")) { //add Employee object to list empList.add(emp); } } @Override public void characters(char ch[], int start, int length) throws SAXException { if (bAge) { //age element, set Employee age emp.setAge(Integer.parseInt(new String(ch, start, length))); bAge = false; } else if (bName) { emp.setName(new String(ch, start, length)); bName = false; } else if (bRole) { emp.setRole(new String(ch, start, length)); bRole = false; } else if (bGender) { emp.setGender(new String(ch, start, length)); bGender = false; } } }
MyHandler类持有一个寄存Employee对象的List援用,它只要一个对应的getter要领。Employee对象在事宜处置惩罚函数中被添加到List对象,在MyHandler类中还定义了Employee对象和它的几个字段相干的boolean范例变量用于建立Employee对象,当Employee对象的一切属性都被设置时,它就会被添加到list中。
我们重写了几个主要的要领startElement(), endElement() 和characters().
当SAXParser 最先剖析文档时碰到元素的最先标签时,startElement() 要领就会被挪用,我们重写了这个要领,运用boolean范例变量来辨别元素种别。我们也是在该要领中,当Employee 标签最先时建立Employee 对象。
当SAXParser碰到元素中的字符串数据时characters()要领会被挪用,我们运用boolean范例字段为Employee对象的属性举行赋值。
endElement()要领则会在SAXParser 碰到XML完毕标签时会被挪用,在这里我们將Employee对象添加到List对象中。
鄙人面的测试顺序中,我们运用MyHandler剖析XML文档生成寄存Employee 对象List。
XMLParserSAX.java
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 list List<Employee> empList = handler.getEmpList(); //print employee information for(Employee emp : empList) System.out.println(emp); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
运转顺序输出:
Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=ManagerEmployee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager
SAXParserFactory 类供应了工场要领来猎取SAXParser 实例,在挪用 SAXParser对象的parse要领时传入Handler对象来处置惩罚回调事宜。SAXParser剖析机制刚最先打仗时有点庞杂,然则当你致力于处置惩罚大型的XML文档时,它比DOM剖析供应了更有用的剖析机制。
以上就是Java&Xml教程(五)运用SAX体式格局剖析XML文件的内容,更多相干内容请关注ki4网(www.ki4.cn)!