XML项目工程展示图如下图:
student.xml 文件展示: <?xml version="1.0" encoding="utf-8" ?> <person> <student id='1'> <name>余超</name> <sex>男</sex> <desc>一个执着而又天真的孩子</desc> </student> <student id='2'> <name>马靖</name> <sex>女</sex> <desc>一个特别难追求的女孩子</desc> </student> </person> Student实体类的展示:其作用就是用于临时保存xml文件中的数据到属性中 package net.nyist.xmlparse.domain; import java.io.Serializable; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年9月30日 下午10:52:47 */ @SuppressWarnings("serial") public class Student implements Serializable { private int id; private String name; private String sex; private String desc; public Student() { } public Student(int id, String name, String sex, String desc) { this.id = id; this.name = name; this.sex = sex; this.desc = desc; } 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", desc=" + desc + "]"; } }
方法一:通过DOM来解析XML文件
package net.nyist.xmlparse.parse.dom
import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import net.nyist.xmlparse.domain.Student; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年9月30日 下午11:12:57 */ public class DocumentBuilderFactoryDemo { public static void main(String[] args) {
long start = System.currentTimeMillis(); /** 首先得到:得到 DOM 解析器的工厂实例 */ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); List<Student> students = new ArrayList<Student>(); try { /** 然后从 DOM 工厂获得 DOM 解析器 */ DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); InputStream is = DocumentBuilderFactoryDemo.class.getClassLoader() .getResourceAsStream("student.xml"); Document document = documentBuilder.parse(is); /** 得到 XML 文档的根节点 */ Element element = document.getDocumentElement(); NodeList nodeList = element.getElementsByTagName("student"); Student student = null; for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); int id = Integer.parseInt(node.getAttributes() .getNamedItem("id").getNodeValue()); String nameValue = ""; String sexValue = ""; String descValue = ""; if (node.hasChildNodes()) { NodeList childNodes = node.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) { Node node2 = childNodes.item(j); if ("name".equals(node2.getNodeName())) { nameValue = node2.getFirstChild().getTextContent(); } else if ("sex".equals(node2.getNodeName())) { sexValue = node2.getFirstChild().getTextContent(); } else if ("desc".equals(node2.getNodeName())) { descValue = node2.getFirstChild().getTextContent(); } } student = new Student(id, nameValue, sexValue, descValue); students.add(student); } } } catch (Exception e) { e.printStackTrace(); } for (int i = 0; students != null && students.size() > 0 && i < students.size(); i++) { System.out.println(students.get(i)); }
System.out.println("共用时:"+(System.currentTimeMillis()-start)); } }
方法二:用SAX解析XML文件
package net.nyist.xmlparse.parse.sax; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.nyist.xmlparse.domain.Student; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年10月1日 下午6:38:52 * * @deprecated 本类是用来对于XML文本的解析类 */ public class PersonHandle extends DefaultHandler { private Student student; private List<Student> students; /**对于这个属性的使用主要作用是为了用来存放标签的名称,由此而获得这个标签下的文本内容的值*/ private String tagName; public List<Student> getStudents() { return students; } public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException { return null; } public void setDocumentLocator(Locator locator) { System.out.println("加载器开始处理xml文档........"); } public void startDocument() throws SAXException { System.out.println("文档开始加载........."); students = new ArrayList<Student>(); } public void endDocument() throws SAXException { System.out.println("xml文档处理结束........."); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { tagName = qName; if ("student".equals(qName)) { student = new Student(); int id = Integer.parseInt(attributes.getValue("id")); student.setId(id); } } public void endElement(String uri, String localName, String qName) throws SAXException { if ("student".equals(qName)) { students.add(student); } /**将其值变为null的主要目的是为了防止再次遍历的时候保存了结尾标签,这样会有空值的存在*/ tagName = null; } public void characters(char ch[], int start, int length) throws SAXException { if (!"".equals(tagName) && tagName != null) { if ("name".equals(tagName)) { student.setName(new String(ch, start, length)); } else if ("sex".equals(tagName)) { student.setSex(new String(ch, start, length)); } else if ("desc".equals(tagName)) { student.setDesc(new String(ch, start, length)); } } } public static void main(String[] args) { PersonHandle personHandle =new PersonHandle(); System.out.println(personHandle.getStudents()); } } package net.nyist.xmlparse.parse.sax; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import net.nyist.xmlparse.domain.Student; import org.xml.sax.SAXException; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年10月1日 下午6:30:51 */ public class SaxFacroryParseDemo { public static void main(String[] args) { long start =System.currentTimeMillis(); /** 创建SAX解析器工厂对象*/ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { /** 使用解析器工厂创建解析器实例 */ SAXParser saxParser = saxParserFactory.newSAXParser(); /**加载资源文件*/ InputStream is = SaxFacroryParseDemo.class.getClassLoader() .getResourceAsStream("student.xml"); /** * 如果采用SAX方式来对于XML文件的处理的时候必须要使用xml文件的处理类: * 对于本例我使用默认的处理类PersonHandle,此类必须要继承 DefaultHandler 这个类,然后重载这个类的方法,以至于对于xml文档的处理 * * */ PersonHandle personHandle = new PersonHandle(); saxParser.parse(is, personHandle); List<Student> students = personHandle.getStudents(); System.out.println("打印文档的内容:"); for (int i = 0; students != null && i < students.size(); i++) System.out.println(students.get(i)); System.out.println("共用时:"+(System.currentTimeMillis()-start)); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
方法三:jdom解析XML文件:需要引入jdom.jar包
package net.nyist.xmlparse.parse.jdom; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import net.nyist.xmlparse.domain.Student; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年10月1日 下午9:08:47 */ public class SAXBuilderDemo { @SuppressWarnings("unchecked") public static void main(String[] args) { long start = System.currentTimeMillis(); SAXBuilder saxBuilder = new SAXBuilder(); /**加载资源文件*/ InputStream in = SAXBuilderDemo.class.getClassLoader() .getResourceAsStream("student.xml"); try { Document document = saxBuilder.build(in); Element element = document.getRootElement(); List<Element> list = element.getChildren(); if (list != null && list.size() > 0) { List<Student> students = new ArrayList<Student>(); for (int i = 0; i < list.size(); i++) { Element studentElement = list.get(i); int id = studentElement.getAttribute("id").getIntValue(); String nameValue = studentElement.getChild("name") .getText(); String sexValue = studentElement.getChild("sex").getText(); String descValue = studentElement.getChild("desc") .getText(); Student student = new Student(id, nameValue, sexValue, descValue); students.add(student); } for (int i = 0; students != null && i < students.size(); i++) System.out.println(students.get(i)); System.out.println("共用时:" + (System.currentTimeMillis() - start)); } } catch (JDOMException | IOException e) { e.printStackTrace(); } } }
方法四:通过dom4j解析XML文件:引入两个包dom4j.jar 与jaxen.jar
package net.nyist.xmlparse.parse.dom4j; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import net.nyist.xmlparse.domain.Student; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年10月1日 下午9:45:12 */ public class SAXReaderDemo { @SuppressWarnings("unchecked") public static void main(String[] args) { long start = System.currentTimeMillis(); SAXReader saxReader =new SAXReader(); InputStream in =SAXReaderDemo.class.getClassLoader().getResourceAsStream("student.xml"); try { Document document = saxReader.read(in); Element element = document.getRootElement(); List<Element> rootElements = element.elements(); List<Student> students =new ArrayList<Student>(); Student student =null; for (int i = 0;rootElements!=null && i < rootElements.size(); i++) { Element childElement = rootElements.get(i); int id =Integer.parseInt(childElement.attribute("id").getText()); String nameValue =childElement.elementText("name"); String sexValue =childElement.elementText("sex"); String descValue =childElement.elementText("desc"); student =new Student(id, nameValue, sexValue, descValue); students.add(student); } for (int i = 0; students != null && i < students.size(); i++) System.out.println(students.get(i)); System.out.println("共用时:" + (System.currentTimeMillis() - start)); } catch (DocumentException e) { e.printStackTrace(); } } }