android pull解析XML

来源:互联网 发布:js数组地址指向 编辑:程序博客网 时间:2024/06/05 16:35
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xml_pullparse"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.xml_pullparse.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

这个是要解析的xml


package com.example.xml_pullparse;


import java.io.Serializable;


public class ManifestObjective implements Serializable{
/**

*/
private static final long serialVersionUID = 1L;
private String mXmlns;
private String mPackage;
private String mVersionCode;
private String mVersionName;
private String minSdkVersion;
private String targetSdkVersion;
private boolean allowBackup;
private String icon;
private String lable;
private String theme;


private String activityName;
private String activityLable;

private String action;
private String category;


public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getmXmlns() {
return mXmlns;
}
public void setmXmlns(String mXmlns) {
this.mXmlns = mXmlns;
}
public String getmPackage() {
return mPackage;
}
public void setmPackage(String mPackage) {
this.mPackage = mPackage;
}
public String getmVersionCode() {
return mVersionCode;
}
public void setmVersionCode(String mVersionCode) {
this.mVersionCode = mVersionCode;
}
public String getmVersionName() {
return mVersionName;
}
public void setmVersionName(String mVersionName) {
this.mVersionName = mVersionName;
}
public String getMinSdkVersion() {
return minSdkVersion;
}
public void setMinSdkVersion(String minSdkVersion) {
this.minSdkVersion = minSdkVersion;
}
public String getTargetSdkVersion() {
return targetSdkVersion;
}
public void setTargetSdkVersion(String targetSdkVersion) {
this.targetSdkVersion = targetSdkVersion;
}
public boolean isAllowBackup() {
return allowBackup;
}
public void setAllowBackup(boolean allowBackup) {
this.allowBackup = allowBackup;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
public String getTheme() {
return theme;
}
public String getActivityName() {
return activityName;
}
public void setActivityName(String activityName) {
this.activityName = activityName;
}
public String getActivityLable() {
return activityLable;
}
public void setActivityLable(String activityLable) {
this.activityLable = activityLable;
}
public void setTheme(String theme) {
this.theme = theme;
}

}

这个是解析xml过程中需要把数据封装的对象

package com.example.xml_pullparse;


import java.io.InputStream;


import org.xml.sax.Parser;
import org.xmlpull.v1.XmlPullParser;


import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
/**
 * 使用pull方式解析xml
 * @author Administrator
 *示例将要解析清单文件
 */
public class PullParseUtil {
private static final String TAG="PullParseUtil";
private Context mContext;


private XmlPullParser mXmlPullParser;
public PullParseUtil(Context context,XmlPullParser parser) {
this.mContext=context;
this.mXmlPullParser=parser;
}
public ManifestObjective pullParseXml(InputStream is) throws Exception{


ManifestObjective obj=null;
mXmlPullParser.setInput(is, "UTF-8");
//开始解析事件
int eventType=mXmlPullParser.getEventType();
Log.i(TAG, "解析eventType="+eventType);
//处理事件,没有碰到文档结尾就一直处理
while(eventType!=XmlPullParser.END_DOCUMENT){
//根据标签来处理事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
//开始初始化资源,或者不做任何操作
obj = new ManifestObjective();
break;
case XmlPullParser.START_TAG:
//解析xml节点数据,获取当前标签名字
String tagName=mXmlPullParser.getName();
Log.i(TAG, "解析TagName ="+tagName);
if(tagName.trim().equals("manifest")){




obj.setmXmlns(mXmlPullParser.getAttributeValue(0));
obj.setmPackage(mXmlPullParser.getAttributeValue(1));
obj.setmVersionCode(mXmlPullParser.getAttributeValue(2));
obj.setmVersionName(mXmlPullParser.getAttributeValue(3));
Log.i(TAG, "解析TagName value="+obj.getmPackage()+obj.getmVersionCode()+obj.getmVersionCode()+obj.getmVersionName());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}else if(tagName.trim().equals("uses-sdk")){


obj.setMinSdkVersion(mXmlPullParser.getAttributeValue(0));
obj.setTargetSdkVersion(mXmlPullParser.getAttributeValue(1));
Log.i(TAG, "解析TagName value="+obj.getMinSdkVersion()+obj.getTargetSdkVersion());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}else if(tagName.trim().equals("application")){
obj.setAllowBackup(mXmlPullParser.getAttributeValue(0).equals("true")?true:false);


obj.setIcon(mXmlPullParser.getAttributeValue(1));//这里直接获取的资源的字符串,转成drawable不会。
obj.setLable(mXmlPullParser.getAttributeValue(2));
obj.setTheme(mXmlPullParser.getAttributeValue(3));


Log.i(TAG, "解析TagName value="+obj.isAllowBackup()+obj.getIcon().toString()+obj.getLable()+obj.getTheme());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}else if(tagName.trim().equals("activity")){
obj.setActivityName(mXmlPullParser.getAttributeValue(0));


obj.setActivityLable(mXmlPullParser.getAttributeValue(1));


Log.i(TAG, "解析TagName value="+obj.getActivityName()+obj.getActivityLable());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}
else if(tagName.trim().equals("intent-filter")){//这里面没有属性值,不解析但是要mXmlPullParser.next()把事件驱动到下一个

mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}
else if(tagName.trim().equals("action")){
obj.setAction(mXmlPullParser.getAttributeValue(0));
Log.i(TAG, "解析TagName value="+obj.getAction());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}
else if(tagName.trim().equals("category")){
obj.setCategory(mXmlPullParser.getAttributeValue(0));
Log.i(TAG, "解析TagName value="+obj.getCategory());
mXmlPullParser.next();//这个放在这里最后面,放在前面getAttributeValue返回有问题。
}
break;
case XmlPullParser.END_TAG:
//这里不做处理,根据xml文件格式自己需要处理就写
break;
}
//这里很重要,指导解析器进入下一个事件,解析。不然你的eventType就只有START_DOCUMENT
eventType=mXmlPullParser.next();
Log.i(TAG, "驱动到下一个eventType="+eventType);
}
Log.i(TAG, "最后返回="+obj.getCategory());
return obj;



}


这个是解析xml的类

这个是mainactivity的布局文件。测试xml的解析,显示解析结果


package com.example.xml_pullparse;


import java.io.IOException;
import java.io.InputStream;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener{
private PullParseUtil mPullParseUtil;

private Button mButton;

private TextView mTextView;

private ManifestObjective obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);

mButton=(Button) findViewById(R.id.show_mainfist);
mButton.setOnClickListener(this);

mTextView=(TextView) findViewById(R.id.tv_showmainfist);

}
private Handler mHandler=new Handler(){


@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//在这里更新UI
if(obj!=null){
mTextView.setText("<manifest\t"+"xmlns:android="+"\""+obj.getmXmlns()+"\""+"\n"+"package="+"\""+obj.getmPackage()+"\""+"\n"
+"android:versionCode="+"\""+obj.getmVersionCode()+"\""+"\n"+"\""+"android:versionName="+obj.getmVersionName()+"\""+">"+"\n"
+"<uses-sdk"+"\nandroid:minSdkVersion="+"\""+obj.getMinSdkVersion()+"\""+"\n"+"android:targetSdkVersion="+"\""+obj.getTargetSdkVersion()+"\""+"/>"+"\n"
);
}else{
Log.e("Tag", "pull解析返回mull对象");

}
}

};
@Override
public void onClick(View view) {
try {
XmlPullParser parser=XmlPullParserFactory.newInstance().newPullParser();
mPullParseUtil=new PullParseUtil(this, parser);
InputStream is=getResources().getAssets().open("AndroidManifest.xml");//这里不知道怎么获取清单文件作为输入流,只能copy后放到assets中了

try {
obj=mPullParseUtil.pullParseXml(is);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Message msg=Message.obtain();
mHandler.sendMessage(msg);


} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

在activity里面我们测试了一下,这里只是把前面一部分显示出来,太麻烦了,结果是正确的。后面就不写了,纯属浪费时间


原创粉丝点击