`
wiseideal
  • 浏览: 449034 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

用SAX读写XML文件

阅读更多
今天的项目里做了一个缓存文件 利用的就是xml
读都好说 其实写也很简单 机械化了一点 不过都是必要的
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlSerializer;



import android.util.Xml;

import com.yolove.player.entity.AudioInfo;

public class PlaylistSyncUtil {
	public static ArrayList<AudioInfo> list;
	
	public PlaylistSyncUtil(){
		
	}
	public static void savetoLocal(ArrayList<AudioInfo> audiolist,String path){
		//取得文件名
		String name=path.substring(path.lastIndexOf("/")+1, path.lastIndexOf("."));
		//得到xml序列化工具
		XmlSerializer serializer=Xml.newSerializer();
		//生成Stringwriter对象
		StringWriter writer=new StringWriter();
		if(audiolist.size()>0){
			try {
				serializer.setOutput(writer);
				//XML文件头
				serializer.startDocument("UTF-8", true);
				/*
				 * 开始xml文件主体的构建
				 * xml的根root为playlist
				 * 次级根为audioInfo 标识每一个单独的audioinfo对象
				 * 对象中的属性以<></>的格式进行存储
				 */
				//<playlist>
				serializer.startTag("", "playlist");
				for(int i=0;i<audiolist.size();i++){
					AudioInfo info=audiolist.get(i);
					serializer.startTag("", "AudioInfo");
					
					serializer.startTag("", "id");
					serializer.text(info.getId()+"");
					serializer.endTag("", "id");
					
					serializer.startTag("", "data");
					serializer.text(info.getData()+"");
					serializer.endTag("", "data");
					
					serializer.startTag("", "displayname");
					serializer.text(info.getDisplayName()+"");
					serializer.endTag("", "displayname");
					
					serializer.startTag("", "size");
					serializer.text(info.getSize()+"");
					serializer.endTag("", "size");
					
					serializer.startTag("", "dateAdded");
					serializer.text(info.getDateAdded()+"");
					serializer.endTag("", "dateAdded");
					
					serializer.startTag("", "dateModified");
					serializer.text(info.getDateModified()+"");
					serializer.endTag("", "dateModified");
					
					serializer.startTag("", "title");
					serializer.text(info.getTitle()+"");
					serializer.endTag("", "title");
					
					serializer.startTag("", "duration");
					serializer.text(info.getDuration()+"");
					serializer.endTag("", "duration");
					
					serializer.startTag("", "artistId");
					serializer.text(info.getArtistId()+"");
					serializer.endTag("", "artistId");
					
					serializer.startTag("", "albumId");
					serializer.text(info.getAlbumId()+"");
					serializer.endTag("", "albumId");
					
					serializer.startTag("", "year");
					serializer.text(info.getYear()+"");
					serializer.endTag("", "year");
					
					serializer.startTag("", "bookmark");
					serializer.text(info.getBookMark()+"");
					serializer.endTag("", "bookmark");
					
					serializer.startTag("", "lrcData");
					serializer.text(info.getLrcData()+"");
					serializer.endTag("", "lrcData");
					
					serializer.startTag("", "picData");
					serializer.text(info.getPicData()+"");
					serializer.endTag("", "picData");
					
					serializer.startTag("", "album");
					serializer.text(info.getAlbum()+"");
					serializer.endTag("", "album");
					
					serializer.startTag("", "artist");
					serializer.text(info.getArtist()+"");
					serializer.endTag("", "artist");
					
					serializer.startTag("", "lpDownOnce");
					serializer.text(info.isLpDownOnce()+"");
					serializer.endTag("", "lpDownOnce");
					
					serializer.startTag("", "uuid");
					serializer.text(info.getUuid()+"");
					serializer.endTag("", "uuid");
					
					serializer.startTag("", "type");
					serializer.text(info.getType()+"");
					serializer.endTag("", "type");
					
					serializer.startTag("", "smallpicurl");
					serializer.text(info.getSmallpicurl()+"");
					serializer.endTag("", "smallpicurl");
					
					serializer.startTag("", "bigpicurl");
					serializer.text(info.getBigpicurl()+"");
					serializer.endTag("", "bigpicurl");
					
					serializer.startTag("", "description");
					serializer.text(info.getDescription()+"");
					serializer.endTag("", "description");
					
					serializer.startTag("", "isplaying");
					serializer.text(info.isPlaying()+"");
					serializer.endTag("", "isplaying");
					
					serializer.startTag("", "isselected");
					serializer.text(info.isSelected()+"");
					serializer.endTag("", "isselected");
					
					serializer.endTag("", "AudioInfo");
				}
				serializer.endTag("", "playlist");
				serializer.endDocument();
		}catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
			//结果字符串
//			writer.toString();
		 boolean flag = true; 
         BufferedReader bufferedReader = null; 
         BufferedWriter bufferedWriter = null; 
         try { 
                 File distFile = new File(path);
                 if(distFile.exists()){
                	 distFile.delete();
                 }
                 bufferedReader = new BufferedReader(new StringReader(writer.toString())); 
                 bufferedWriter = new BufferedWriter(new FileWriter(distFile)); 
                 char buf[] = new char[1024];         //字符缓冲区 
                 int len; 
                 while ((len = bufferedReader.read(buf)) != -1) { 
                         bufferedWriter.write(buf, 0, len); 
                 } 
                 bufferedWriter.flush(); 
                 bufferedReader.close(); 
                 bufferedWriter.close(); 
         } catch (IOException e) { 
                 e.printStackTrace(); 
                 flag = false; 
         } finally { 
                 if (bufferedReader != null) { 
                         try { 
                                 bufferedReader.close(); 
                         } catch (IOException e) { 
                                 e.printStackTrace(); 
                         } 
                 } 
         } 
		} 
	}
	public static ArrayList<AudioInfo> getAudioListFromLocal(String path){
		SAXParserFactory sax=SAXParserFactory.newInstance();
		PlaylistXMLHandler playlistHandler=new PlaylistXMLHandler();
		try {
			SAXParser parser=sax.newSAXParser();
			XMLReader reader=parser.getXMLReader();
			reader.setContentHandler(playlistHandler);
			reader.parse(new InputSource(new FileInputStream(new File(path))));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	
	static class PlaylistXMLHandler extends DefaultHandler {
		String tag;
		AudioInfo info;
		StringBuilder builder=new StringBuilder();
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			// TODO Auto-generated method stub
			if(!(tag.equals(""))){
				builder.append(ch,start,length);
			}
			super.characters(ch, start, length);
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			// TODO Auto-generated method stub
			super.endElement(uri, localName, qName);
			if(tag.equals("uuid")){
				info.setUuid(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("artist")){
				info.setArtist(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("id")){
				info.setId(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("size")){
				info.setSize(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("bookmark")){
				info.setBookMark(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			//
			else if(tag.equals("year")){
				info.setYear(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("albumId")){
				info.setAlbumId(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("artistId")){
				info.setArtistId(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("dateAdded")){
				info.setDateAdded(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("dateModified")){
				info.setDateModified(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("title")){
				info.setTitle(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("lpDownOnce")){
				info.setLpDownOnce((builder.toString().replaceAll("\n", "").replaceAll("\\s", "").equals("true")?true:false));
				builder.setLength(0);
			}
			else if(tag.equals("isplaying")){
				info.setPlaying((builder.toString().replaceAll("\n", "").replaceAll("\\s", "").equals("true")?true:false));
				builder.setLength(0);
			}
			else if(tag.equals("isselected")){
				info.setSelected((builder.toString().replaceAll("\n", "").replaceAll("\\s", "").equals("true")?true:false));
				builder.setLength(0);
			}
			else if(tag.equals("artist")){
				info.setArtist(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("songname")){
				info.setTitle(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("album")){
				info.setAlbum(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("duration")){
				info.setDuration(Integer.parseInt(builder.toString().replaceAll("\n", "").replaceAll("\\s", "")));
				builder.setLength(0);
			}
			else if(tag.equals("type")){
				info.setType(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("data")){
				info.setData(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				//System.out.println("url--->"+builder);
				builder.setLength(0);
			}
			else if(tag.equals("smallpicurl")){
				info.setSmallpicurl(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				//System.out.println("smallpicurl--->"+builder);
				builder.setLength(0);
			}
			else if(tag.equals("bigpicurl")){
				info.setBigpicurl(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				//System.out.println("bigpicurl--->"+builder);
				builder.setLength(0);
			}
			else if(tag.equals("lrcData")){
				info.setLrcData(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("picData")){
				info.setPicData(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("description")){
				info.setDescription(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			else if(tag.equals("displayname")){
				info.setDisplayName(builder.toString().replaceAll("\n", "").replaceAll("\\s", ""));
				builder.setLength(0);
			}
			tag="";
			if(localName.equals("AudioInfo")){
				list.add(info);
			}
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			// TODO Auto-generated method stub
			super.startElement(uri, localName, qName, attributes);
			tag=localName;
			if(tag.equals("playlist")){
				if(list==null)
				list=new ArrayList<AudioInfo>();
				else{
					list.clear();
				}
			}else if(tag.equals("AudioInfo")){
				info=new AudioInfo();
			}
		}
		
	}
}



分享到:
评论

相关推荐

    Sax解析XML文件解析

    2. **内存消耗小**:与DOM解析器(将整个XML结构转化为内存中的树形结构)相比,SAX解析器对内存的需求较少。 3. **实时性**:因为是事件驱动,解析过程可以与数据处理同时进行,提高了程序的响应速度。 **SAX解析...

    SAX--XML文件读写

    XML(eXtensible Markup Language)是一种...通过实现`ContentHandler`接口,开发者可以自定义XML数据的处理逻辑,实现对XML数据的逐个节点读取和处理。同时,结合JSON库,SAX也能帮助完成JSON到XML的数据转换任务。

    使用SAX读取XML文件

    本文将深入探讨如何使用SAX(Simple API for XML)解析器来读取XML文件,这是一种基于事件驱动的解析方式,非常适合处理大型或内存受限的环境。 SAX解析器不同于DOM(Document Object Model)解析器,DOM会将整个...

    [Android]使用SAX解析XML文件

    本篇将重点讲解如何使用SAX(Simple API for XML)解析XML文件,这是一种事件驱动的解析方式,非常适合处理大体积的XML文件,因为它不会一次性加载整个文件到内存中,从而节省了资源。 首先,了解SAX解析的基本原理...

    Android中使用SAX对XMl文件进行解析

    在Android Studio的build.gradle文件中,确保已经包含了对`org.xml.sax`的支持,这通常作为Android SDK的一部分默认提供,无需额外添加库。 接下来,我们创建一个SAX事件处理器。这个处理器实现了`org.xml.sax....

    使用SAX解析XML文件个人总结

    3. **创建自定义Handler**:定义一个类继承自`org.xml.sax.helpers.DefaultHandler`,并重写其中的方法以实现对XML文件的解析。 ```java class PersonParser extends DefaultHandler { // 重写方法... } ``` 4...

    SAX解析xml文件源码

    SAX(Simple API for XML)是一种轻量级的XML解析技术,主要用于读取XML文档。相较于DOM解析,SAX解析不将整个XML文档加载到内存中,而是采用事件...不过,这需要对XML的结构有清晰的理解,并准备处理各种解析事件。

    SAX解析超大XML文件 示例代码

    程序员可以自定义这些处理器方法来处理事件,从而实现对XML文件的解析。 以下是一个简单的SAX解析超大XML文件的Java示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import ...

    使用SAX解析xml文件

    XML(eXtensible Markup Language)是一种用于存储和交换数据的标记语言,它在Web服务、配置文件、数据传输等领域广泛应用。...通过自定义处理器,你可以灵活地实现对XML数据的定制化处理,满足各种业务需求。

    sax解析xml文件

    这些处理器方法由应用程序实现,从而对XML文档进行处理。下面将详细介绍SAX解析XML的基本步骤、主要接口及其实现方法。 1. **基本步骤:** - 创建`SAXParserFactory`实例,用于生成`SAXParser`。 - 使用`...

    android 使用Sax解析XML 源码实例

    使用SAX方式解析XML SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件...

    dom和sax对xml的解析

    如果需要频繁地对XML进行随机访问和修改,DOM可能是更好的选择;如果关注性能和内存效率,或者处理的XML文件非常大,SAX则更合适。 通过`DomDemo.java`和`SaxDemo.java`,你可以深入理解这两种解析方式的差异和使用...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    sax生成并解析大文件的xml

    在Java中,使用SAX生成XML文件并不常见,因为SAX通常用于解析,而不是创建。然而,通过自定义`ContentHandler`,我们可以控制XML元素的生成过程。`ContentHandler`是一个接口,包含如`startElement`、`endElement`...

    android sax ,dom生成xml文件

    在提供的压缩包文件中,可能包含了一个名为`MenuDemo1`的示例,展示了如何在Android应用中创建XML菜单,以及一个名为`SAXMake`的示例,演示了使用SAX生成XML文件的具体实现。通过研究这些示例,开发者可以更好地理解...

    SAX解析XML文件以及排序

    结合上述信息,我们可以创建一个示例程序,使用SAX解析XML文件,并对从中提取的id进行冒泡排序: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers....

    SDcard数据访问SAX解析XML文件

    要使用SAX解析XML文件,我们需要遵循以下步骤: 1. **创建解析器**: 首先,我们需要创建一个SAX解析器。Android提供了一个内置的`DefaultHandler`类,我们可以继承它并重写其中的方法来处理解析过程中遇到的事件。 ...

    qt使用DOM和SAX两种方式读写XML文件,代码工程demo,亲测可用

    在Qt框架中,处理XML文件是常见的需求,本项目提供了一个使用DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式的示例,帮助开发者理解如何在Qt环境下进行XML文件的读写操作。 首先,DOM是一种...

    android sax解析xml文件

    - 虽然SAX解析效率高,但对XML结构的修改和查询较为不便,适用于只需要读取数据的场景。 通过以上内容,你应该对Android中使用SAX解析XML有了深入的理解。实践过程中,可以结合具体XML文件结构和业务需求,灵活运用...

Global site tag (gtag.js) - Google Analytics