当前位置:文档之家› 四中最常用的XML文件解析总结

四中最常用的XML文件解析总结

XML文件学习总结掌握了XML文件解析的常用的4中方式:DOM解析、SAX 解析、STAX解析以及DOM4j解析XML文件。

一、DOM 解析xml文件public List<Student> parse(String url) throws Exception{// 1、创建解析工厂D ocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();//创建工厂是单例模式,不能直接new对象,需要调用newInstance来创建对象。

// 2、创建解析器D ocumentBuilder builder = factory.newDocumentBuilder();// 3、创建解析器的urlF ile file = new File(url);// 4、得到解析后的Document对象D ocument doncument = builder.parse(file);// 5、通过得到节点名字得到所有同名节点的集合NodeListN odeList nodeList = doncument.getElementsByTagName("student");// 6、遍历NodeList集合f or (int i = 0; i < nodeList.getLength(); i++) {// 得到每个节点对象Node studentNode = nodeList.item(i);Student st = new Student();NamedNodeMap map = studentNode.getAttributes();//for(int j=0;j<map.getLength();j++){Attr attr = (Attr)map.item(0);//}st.setId(Integer.parseInt(attr.getValue()));NodeList childList = studentNode.getChildNodes();for(int j=0;j<childList.getLength();j++){Node childNode = childList.item(j);if(childNode.getNodeName().equals("name")){st.setName(childNode.getTextContent());}if(childNode.getNodeName().equals("age")){st.setAge(Integer.parseInt(childNode.getTextContent()));}if(childNode.getNodeName().equals("birthday")){String str2 = childNode.getTextContent();SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");Date birthday = sdf.parse(str2);st.setBirthday(birthday);}}studentList.add(st);}r eturn studentList;}Xml文件为:(studen.xml)<?xml version="1.0" encoding="UTF-8"?><students><student id="5"><name>aaa</name><age>20</age><birthday>1990-10-10</birthday></student><student id="2"><name>bbb</name><age>30</age><birthday>1990-10-10</birthday></student><student id="3"><name>ccc</name><age>40</age><birthday>1990-10-10</birthday></student></students>解析后的文件为:5 aaa 20 Wed Oct 10 00:00:00 CST 19902 bbb 30 Wed Oct 10 00:00:00 CST 19903 ccc 40 Wed Oct 10 00:00:00 CST 1990二、Sax XML文件解析:Sax解析XML文件是属于事件请求解析。

主要是回调请求解析,来重写类中的方法来解析XML文件public class TestSAX extends DefaultHandler{private Vector<String> tagName;private Vector<String> tagValue;private int step;//方法重写的部分// 开始解析XML文件public void startDocument() throws SAXException{tagName = new Vector<String>();tagValue = new Vector<String>();step = 0;}// 结束解析XML文件public void endDocument() throws SAXException{for (int i = 0; i < tagName.size(); i++){if (!tagName.get(i).equals("") || tagName.get(i) != null){System.out.println("节点名称:"+ tagName.get(i)+"---------------节点值:" + tagValue.get(i).trim());// System.out.println("节点值:" + tagValue.get(i));}}}/***在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分*这些重复的元素.qName是什么?<name:page ll=""></name:page>这样写就会抛出SAXException错误*通常情况下qName等于localName*/public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{// 节点名称tagName.add(qName);// 循环输出属性for (int i = 0; i < attributes.getLength(); i++){// 获取属性名称System.out.println("属性名称:" + attributes.getQName(i));// 获取属性值System.out.println("属性值:"+ attributes.getValue(attributes.getQName(i)));}}*在遇到结束标签时调用此方法*/public void endElement(String uri, String localName, String qName) throws SAXException{step = step + 1;}/***读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048,*每解释到新的字符会把它添加到char[]里。

*注意,这个char字符会自己管理存储的字符,*并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的,*暂时找不到规律,以后看源代码.**这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值*/public void characters(char ch[], int start, int length) throws SAXException{// 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内if (tagName.size() - 1 == tagValue.size()){tagValue.add(new String(ch, start, length));}}public static void main(String[] args){String filename = "F://student.xml";// String filename = "d:/test.xml";SAXParserFactory spf = SAXParserFactory.newInstance(); //创建SAXParserFactory工厂对象try{SAXParser saxParser = spf.newSAXParser();saxParser.parse(new File(filename), new TestSAX());}catch (Exception e){e.printStackTrace();}}STAX 解析XML文件(事件处理模式解析)package com;import java.io.FileInputStream;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamReader;public class STAXTest {public List<Student> parse(String fileName) throws Exception {// STAX// 创建解析器工厂XMLInputFactory factory =XMLInputFactory.newInstance();// 创建解析器InputStream is = new FileInputStream(fileName);XMLStreamReader xsr =factory.createXMLStreamReader(is);List<Student> list = new ArrayList<Student>();Student st = new Student();String flag = "";while (xsr.hasNext()){int event = xsr.next();if (event == XMLStreamConstants.START_ELEMENT) { String tagName = xsr.getLocalName();if ("student".equals(tagName)) {st = new Student();String id = xsr.getAttributeValue(0);st.setId(Integer.parseInt(id));}if ("name".equals(tagName)) {flag = "name";}if ("age".equals(tagName)) {flag = "age";}if ("birthday".equals(tagName)) {flag = "birthday";}}if (event == XMLStreamConstants.CHARACTERS) {String str = xsr.getText();if ("name".equals(flag)) {st.setName(str);}if ("age".equals(flag)&& !"".equals(str.trim())) {st.setAge(Integer.parseInt(str.trim()));}if ("birthday".equals(flag)) {SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");try {Date birthday = sdf.parse(str);st.setBirthday(birthday);} catch (Exception e) {}}}if(event == XMLStreamConstants.END_ELEMENT){if("student".equals(xsr.getLocalName())){list.add(st);}}}return list;}public static void main(String[] args) throws Exception {STAXTest st = new STAXTest();List<Student> list = st.parse("student.xml");for(Student s : list){System.out.println(s.getId()+"\t"+s.getName().trim()+" \t"+s.getAge()+"\t"+s.getBirthday());}}}DOM4J解析xml文件:(xml文件的生成,修改,读取、解析)import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class Test1 {/** 生成的文件是放在 F://student.xml 目录下*/public void creat(String url){Document document = DocumentHelper.createDocument(); //建立document对象Element books = document.addElement("students"); //建立根节点Element book = null; //建立普通节点对象Element name = null; //建立下属节点nameElement sex = null; //建立下属节点sexElement age = null; //建立下属节点ageElement group = null; //建立下属节点group/** 添加注释*/document.addComment("aaaaaaaaaaaaaaaaaaaaaaaa");books.addComment("###########刘军飞,2012年元月10日#########");/** 学生一*/book = books.addElement("student"); //通过普通节点对象添加普通节点book.addComment("sssssssssssssssssssssssssss");book.addAttribute("show", "yes"); //设置节点中得属性以及设置属性值name = book.addElement("nameinf"); //添加下属节点name.addAttribute("name", "张三");group = name.addElement("班级"); //添加下属节点group.setText("class1");sex = book.addElement("sex");sex.setText("男");age = book.addElement("age");age.setText("22");/** 学生二*/book = books.addElement("student"); //通过普通节点对象添加普通节点book.addAttribute("show", "yes"); //设置节点中得属性以及设置属性值name = book.addElement("nameinf"); //添加下属节点name.addAttribute("name", "李四");group = name.addElement("班级"); //添加下属节点group.setText("class2");sex = book.addElement("sex");sex.setText("男");age = book.addElement("age");age.setText("25");/** 学生三*/book = books.addElement("student"); //通过普通节点对象添加普通节点book.addAttribute("show", "no"); //设置节点中得属性以及设置属性值name = book.addElement("nameinf"); //添加下属节点name.addAttribute("name", "王五");group = name.addElement("班级"); //添加下属节点group.setText("class3");sex = book.addElement("sex");sex.setText("女");age = book.addElement("age");age.setText("25");try {OutputFormat outputFormat =OutputFormat.createPrettyPrint();outputFormat.setEncoding("gbk");File file = new File(url);FileOutputStream fileOutputStream = new FileOutputStream(file);XMLWriter writer = new XMLWriter(fileOutputStream , outputFormat);writer.write(document);writer.close();} catch (Exception e) {e.printStackTrace();}}public void reader(String url){File file = new File(url);System.out.println("生成的XML文件内容是:");//将xml文件打印到控制台try {FileInputStream fis = new FileInputStream(url);BufferedInputStream bis = newBufferedInputStream(fis);int len = 1;byte[] bytes = new byte[100];while(len>0){len = bis.read(bytes);if(len>0)System.out.print(new String(bytes,0,len));}fis.close();bis.close();} catch (Exception e1) {e1.printStackTrace();}System.out.println("\n\nXML解析后的内容是:");//解析xml文件try {SAXReader reader = new SAXReader();Document document = reader.read(file);List list =document.selectNodes("/students/student/* |/students/student/nameinf/*" ); //xpath匹配节点Iterator iter = list.iterator();int a = 0;while(iter.hasNext()){Element element = (Element)iter.next();if(element.getName().equals("nameinf")){System.out.println("["+element.getName().trim()+"] : ["+element.attribute(0).getName().trim()+"]:["+element.attributeValue("name").trim()+"]");}else {System.out.println("["+element.getName().trim()+"] : ["+element.getText().trim()+"]");}}} catch (DocumentException e) {e.printStackTrace();}}/*** XML文件解析*/public static void main(String[] args) {Test1 test = new Test1();test.creat("F://student.xml");test.reader("F://student.xml");}}。

相关主题