Android中创建与几种解析xml的方法
16lz
2021-01-25
大家好今天我今天给大家讲解一下android中xml的创建以及一些解析xml的常用方法。
首先是创建,我们用XmlSerializer这个类来创建一个xml文件,其次是解析xml文件,常用的有 dom,sax,XmlPullParser等方法,由于sax代码有点复杂,本节只讲解一下dom与XmlPullParser解析,sax我将会在下 一节单独讲解,至于几种解析xml的优缺点我就不再讲述了。
为了方便理解,我做了一个简单的Demo。首先首界面有三个按钮,点击第一个按钮会在sdcard目录下创建一个books.xml文件,另外两个 按钮分别是调用dom与XmlPullParser方法解析xml文件,并将结果显示在一个TextView里。大家可以按照我的步骤一步步来:
第一步:新建一个Android工程,命名为XmlDemo.
第二步:修改main.xml布局文件,代码如下:
view plain copy to clipboard print ?- <?xmlversion= "1.0" encoding= "utf-8" ?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/btn1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="创建XML文件"
- />
- <Button
- android:id="@+id/btn2"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="DOM解析XML"
- />
- <Button
- android:id="@+id/btn3"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="XmlPullParse解析XML"
- />
- <TextView
- android:id="@+id/result"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
第三步:修改主核心程序XmlDemo.java,代码如下:
view plain copy to clipboard print ?- package com.tutor.xml;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.NodeList;
- import org.xml.sax.SAXException;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- import org.xmlpull.v1.XmlSerializer;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.util.Xml;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class XmlDemo extends Activity implements OnClickListener{
- private static final StringBOOKS_PATH= "/sdcard/books.xml" ;
- private ButtonmButton1,mButton2,mButton3;
- private TextViewmTextView;
- @Override
- public void onCreate(BundlesavedInstanceState){
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- //初始化工作
- private void setupViews(){
- mTextView=(TextView)findViewById(R.id.result);
- mButton1=(Button)findViewById(R.id.btn1);
- mButton2=(Button)findViewById(R.id.btn2);
- mButton3=(Button)findViewById(R.id.btn3);
- mButton1.setOnClickListener(this );
- mButton2.setOnClickListener(this );
- mButton3.setOnClickListener(this );
- }
- //创建xml文件
- private void createXmlFile(){
- FilelinceseFile=new File(BOOKS_PATH);
- try {
- linceseFile.createNewFile();
- }catch (IOExceptione){
- Log.e("IOException" , "exceptionincreateNewFile()method" );
- }
- FileOutputStreamfileos=null ;
- try {
- fileos=new FileOutputStream(linceseFile);
- }catch (FileNotFoundExceptione){
- Log.e("FileNotFoundException" , "can'tcreateFileOutputStream" );
- }
- XmlSerializerserializer=Xml.newSerializer();
- try {
- serializer.setOutput(fileos,"UTF-8" );
- serializer.startDocument(null , true );
- serializer.startTag(null , "books" );
- for ( int i= 0 ;i< 3 ;i++){
- serializer.startTag(null , "book" );
- serializer.startTag(null , "bookname" );
- serializer.text("Android教程" +i);
- serializer.endTag(null , "bookname" );
- serializer.startTag(null , "bookauthor" );
- serializer.text("Frankie" +i);
- serializer.endTag(null , "bookauthor" );
- serializer.endTag(null , "book" );
- }
- serializer.endTag(null , "books" );
- serializer.endDocument();
- serializer.flush();
- fileos.close();
- }catch (Exceptione){
- Log.e("Exception" , "erroroccurredwhilecreatingxmlfile" );
- }
- Toast.makeText(getApplicationContext(),"创建xml文件成功!" ,Toast.LENGTH_SHORT).show();
- }
- //dom解析xml文件
- private void domParseXML(){
- Filefile=new File(BOOKS_PATH);
- DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
- DocumentBuilderdb=null ;
- try {
- db=dbf.newDocumentBuilder();
- }catch (ParserConfigurationExceptione){
- e.printStackTrace();
- }
- Documentdoc=null ;
- try {
- doc=db.parse(file);
- }catch (SAXExceptione){
- e.printStackTrace();
- }catch (IOExceptione){
- e.printStackTrace();
- }
- Elementroot=doc.getDocumentElement();
- NodeListbooks=root.getElementsByTagName("book" );
- Stringres="本结果是通过dom解析:" + "/n" ;
- for ( int i= 0 ;i<books.getLength();i++){
- Elementbook=(Element)books.item(i);
- Elementbookname=(Element)book.getElementsByTagName("bookname" ).item( 0 );
- Elementbookauthor=(Element)book.getElementsByTagName("bookauthor" ).item( 0 );
- res+="书名:" +bookname.getFirstChild().getNodeValue()+ "" +
- "作者:" +bookauthor.getFirstChild().getNodeValue()+ "/n" ;
- }
- mTextView.setText(res);
- }
- //xmlPullParser解析xml文件
- private void xmlPullParseXML(){
- Stringres="本结果是通过XmlPullParse解析:" + "/n" ;
- try {
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
- XmlPullParserxmlPullParser=factory.newPullParser();
- xmlPullParser.setInput(Thread.currentThread().getContextClassLoader()
- .getResourceAsStream(BOOKS_PATH),"UTF-8" );
- int eventType=xmlPullParser.getEventType();
- try {
- while (eventType!=XmlPullParser.END_DOCUMENT){
- StringnodeName=xmlPullParser.getName();
- switch (eventType){
- case XmlPullParser.START_TAG:
- if ( "bookname" .equals(nodeName)){
- res+="书名:" +xmlPullParser.nextText()+ "" ;
- }else if ( "bookauthor" .equals(nodeName)){
- res+="作者:" +xmlPullParser.nextText()+ "/n" ;
- }
- break ;
- default :
- break ;
- }
- eventType=xmlPullParser.next();
- }
- }catch (IOExceptione){
- e.printStackTrace();
- }
- }catch (XmlPullParserExceptione){
- e.printStackTrace();
- }
- mTextView.setText(res);
- }
- //按钮事件响应
- public void onClick(Viewv){
- if (v==mButton1){
- createXmlFile();
- }else if (v==mButton2){
- domParseXML();
- }else if (v==mButton3){
- xmlPullParseXML();
- }
- }
- }
第四步:由于我们在Sd卡上新建了文件,需要增加权限,如下代码(第16行):
view plain copy to clipboard print ?- <?xmlversion= "1.0" encoding= "utf-8" ?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package = "com.tutor.xml"
- android:versionCode="1"
- android:versionName="1.0" >
- <applicationandroid:icon="@drawable/icon" android:label= "@string/app_name" >
- <activityandroid:name=".XmlDemo"
- android:label="@string/app_name" >
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN" />
- <categoryandroid:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdkandroid:minSdkVersion="7" />
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- </manifest>
第五步:运行上述工程,查看效果:
启动首界面:
点击创建XML文件按钮,生成books.xml文件
books.xml内容如下:
view plain copy to clipboard print ?- <?xmlversion= '1.0' encoding= 'UTF-8' standalone= 'yes' ?>
- <books>
- <book>
- <bookname>Android教程0 </bookname>
- <bookauthor>Frankie0</bookauthor>
- </book>
- <book>
- <bookname>Android教程1 </bookname>
- <bookauthor>Frankie1</bookauthor>
- </book>
- <book>
- <bookname>Android教程2 </bookname>
- <bookauthor>Frankie2</bookauthor>
- </book>
- </books>
点击DOM解析XML按钮:
点击XmlPullParse解析XML按钮:
Ok~今天就先讲到这里。thx~
更多相关文章
- Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
- 一款常用的 Squid 日志分析工具
- Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影