Dom4j解析,Sax解析,pull解析

来源:互联网 发布:网站服务器和域名绑定 编辑:程序博客网 时间:2024/04/23 18:39

demo4j解析必须导入专门的jar包:dom4j-1.6.1.jar

下面是解析实例,笔记和标示都在代码里。

package jiexi;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Iterator;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;import org.xml.sax.SAXException;public class TestDom4j {/** * dom4j解析(将整个文件读到内存中,形成一个倒置的树结构, * 然后从中读取我们需要的数据,或修改节点)假如文件较大侧效率低, * 比较适合小型的xml文件解析 * 1,生成解析器SaxReader * 2,通过SaxReader得到Document * 3,通过Document获得根元素 * 4,通过元素迭代所有子元素,和属性 * @throws Exception  */public static void main(String[] args) throws Exception {createDocument();readDocument();}/** * 解析xml文件 */private static void readDocument() {//解析器    SAXReader mSaxReader=new SAXReader();    File file=new File("src/children.xml");    Document doc=null;    try {doc=mSaxReader.read(file);} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}    //获得根元素    Element root=doc.getRootElement();        System.out.println("rootName:"+root.getName());        Iterator<Element> iterator=root.elementIterator();    //迭代所有子元素    while(iterator.hasNext()){        Element e=iterator.next();        System.out.println(e.getName()+":"+e.getText());    //迭代所有子元素的属性    for(int i=0;i<e.attributeCount();i++){        String name=e.attribute(i).getName();        System.out.println(name+":"+e.attributeValue(name));    }    }}/** * 使用Java代码生成xml文件 * @param url * @throws SAXException  * @throws FileNotFoundException  */private static void createDocument(){File file=new File("src/student.xml");if(!file.exists()){try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//创建文档并设置根节点Document doc=DocumentHelper.createDocument();Element root=DocumentHelper.createElement("student");doc.setRootElement(root);//第二种方法,先创建根节点,在根据根节点创建文档//Element root2=DocumentHelper.createElement("student");//Document doc2=DocumentHelper.createDocument(root2);//为根节点添加子属性和节点root.addAttribute("name", "zhangsan");Element age=root.addElement("age");age.setText("16");Element grade=root.addElement("grade");grade.setText("99");//书写到xml文件OutputFormat format=new OutputFormat("    ", true);//缩进四个空格,换行为trueFileOutputStream fos=null;try {fos = new FileOutputStream(file);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}XMLWriter writer=null;try {writer = new XMLWriter(fos,format);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {writer.write(doc);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("编写成功!");//打印在控制台XMLWriter writer2=null;try {writer2 = new XMLWriter(format);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {writer2.write(doc);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

Sax解析实例:

带解析的文件:

<?xml version="1.0" encoding="utf-8"?><student name="zhangsan">    <age>16</age>    <grade>99</grade></student>
解析代码:

package jiexi;import java.io.File;import java.io.FileInputStream;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class TestSax {/** * 基于事件流的解析方法 * 不需要把整个文件读取到内存中,占用内存小 * 可以随时停止 * 不能写入xml *  * 使用sax解析的步骤 * 1,继承DefaultHandler并实现其方法 * 2,创建Sax解析器工厂 * 3,获得解析器 * 4,获得输入流 * 5,调用解析器解析方法 * @param args * @throws SAXException  * @throws Exception  */public static void main(String[] args) throws Exception, SAXException {//生成解析器工厂SAXParserFactory sf=SAXParserFactory.newInstance();//生成解析器对象SAXParser sp=sf.newSAXParser();//获得输入流File file=new File("src/student.xml");FileInputStream fis=new FileInputStream(file);ParseReader pReader=new ParseReader();//开始解析sp.parse(fis, pReader);//打印结果System.out.println(pReader.getStudent().toString());}}/** * 继承DefaultHandler对象,实现抽象方法 * @author user * */class ParseReader extends DefaultHandler{private Student student=null;private String tagName=null;public Student getStudent(){return student;}@Overridepublic void startDocument() throws SAXException {super.startDocument();student=new Student();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {super.startElement(uri, localName, qName, attributes);System.out.println("uri:"+uri+",localName:"+localName+",qName:"+qName);    tagName=qName;try {if("student".equals(qName)){student=new Student();student.name=attributes.getValue(0);}} catch (Exception e1) {e1.printStackTrace();}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);if(tagName!=null){if("age".equals(tagName)){student.age=new String(ch,start,length);}else if("grade".equals(tagName)){student.grade=new String(ch,start,length);}}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);tagName=null;}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();}}

pull解析,在Java项目中需要引入jar,Android中则已经集成此jar不需要再引入。

解析文件:

<?xml version="1.0" encoding="utf-8"?><student name="zhangsan">    <age>16</age>    <grade>99</grade></student>

解析代码:

package com.example.getmynumber.util;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.lang.reflect.Field;import java.net.URISyntaxException;import java.net.URL;import org.xmlpull.v1.XmlPullParser;import android.content.Context;import android.util.Log;import android.util.Xml;import com.example.getmynumber.entity.Student;public class UtilHttp {/** * pull解析也是基于事件流的解析方法 * 步骤: * 1,获得解析器对象 * 2,生成流对象 * 3,为解析器绑定流对象 * 4,开始解析(根据EventType和nextText遍历所有的数据) */public static void pullXml(Context context){XmlPullParser parser=Xml.newPullParser();Class mClass=Student.class;Student student=new Student();Reader is=null;try {is=new InputStreamReader(context.getAssets().open("student.xml"));parser.setInput(is);int eventType=parser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){switch(eventType){case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:Log.i("wangsongbin", ""+parser.getName());if("student".equals(parser.getName())){student=new Student();student.name=parser.getAttributeValue(0);parser.next();}else{Field field=mClass.getDeclaredField(parser.getName());if(field!=null){field.setAccessible(true);field.set(student, parser.nextText());}}break;case XmlPullParser.END_TAG:break;}eventType=parser.next();}Log.i("wangsongbin", ""+student.toString());} catch (Exception e) {e.printStackTrace();}finally{Log.i("wangsongbin", ""+student.toString());try {is.close();} catch (Exception e) {e.printStackTrace();}}}}



0 0
原创粉丝点击