Android解析XML

该博客详细介绍了如何从URL获取XML数据,然后通过Java实现XML的解析,创建对应的实体类,以及网络请求类来获取数据。解析后的数据可以用于应用程序的广告更新等场景。整个过程包括了网络请求、XML解析器的使用以及数据实体的构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过URL访问出的xml如下

<update>
	<package>
		<filename>GMMZ_HDi.mp4</filename>
		<version>4</version>
		<md5>C7A665F62792A8C7F82A0DAB1ECF412D</md5>
		<url>http://123.mp4</url>
		<href>http://www.gmmgrammy.com/th/index.html</href>
		<description>AD UPDATE</description>
		<force>true</force>
		<type>mp4</type>
	</package>
</update>

1、根据xml新建一个实体类

public class Ads {
    private String filename;
    private String version;
    private String md5;
    private String url;
    private String href;
    private String description;
    private boolean force;
    private String type;

    public Ads(String filename, String version, String md5, String url, String href, String description, boolean force, String type) {
        this.filename = filename;
        this.version = version;
        this.md5 = md5;
        this.url = url;
        this.href = href;
        this.description = description;
        this.force = force;
        this.type = type;
    }

    public String getFilename() {
        return filename;
    }

    public String getVersion() {
        return version;
    }

    public String getMd5() {
        return md5;
    }

    public String getUrl() {
        return url;
    }

    public String getHref() {
        return href;
    }

    public String getDescription() {
        return description;
    }

    public boolean isForce() {
        return force;
    }

    public String getType() {
        return type;
    }

    @Override
    public String toString() {
        return "Ads{" +
                "filename='" + filename + '\'' +
                ", version='" + version + '\'' +
                ", md5='" + md5 + '\'' +
                ", url='" + url + '\'' +
                ", href='" + href + '\'' +
                ", description='" + description + '\'' +
                ", force=" + force +
                ", type='" + type + '\'' +
                '}';
    }

}

2、创建网络请求类

public class DownloadXmlTask {

    private static final String TAG = "DownloadXmlTask";

    @SuppressLint("UseValueOf")
    public static List<Ads> getData(String xmlUrl) throws Exception {
        URL url = new URL(xmlUrl);
        List<Ads> adsList = null;
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(10000);
        if (conn.getResponseCode() == 200) {
            InputStream inputstream = conn.getInputStream();
            System.out.println("网络连接成功");
            ApsXmlParser apsXmlParser = new ApsXmlParser();
            adsList = apsXmlParser.parse(inputstream);
            return adsList;
        }
        return null;
    }

3、创建解析类,解析请求下来的xml

public class AdsXmlParser {
    private static final String ns = null;

    public List parse(InputStream in) throws XmlPullParserException, IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(in, null);
            parser.nextTag();
            return readUpdate(parser);
        } finally {
            in.close();
        }
    }

	//readUpdate() ⽅法处理以update为头标签,查找标记为“package”的元素作为以递归⽅式
	//处理 update 的起点。如果某个标签不是 package 标签,则会跳过它。以递归⽅式处理完整个xml
	//Feed 后,readUpdate() 将返回 List
    private List readUpdate(XmlPullParser parser) throws XmlPullParserException, IOException {
        List entries = new ArrayList();

        parser.require(XmlPullParser.START_TAG, ns, "update");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
            // Starts by looking for the entry tag
            if (name.equals("package")) {
                entries.add(readPackage(parser));
            } else {
                skip(parser);
            }
        }
        return entries;
    }

    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
                case XmlPullParser.END_TAG:
                    depth--;
                    break;
                case XmlPullParser.START_TAG:
                    depth++;
                    break;
            }
        }
    }

	//这里读取以package为头部标签,下面的子标签就是我们所需的实体类中的每个对象
    private Ads readPackage(XmlPullParser parser) throws XmlPullParserException, IOException {
        parser.require(XmlPullParser.START_TAG, ns, "package");
        String filename = null;
        String version = null;
        String md5 = null;
        String url = null;
        String href = null;
        String description = null;
        boolean force = false;
        String type = null;
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
            if (name.equals("filename")) {
                filename = readFilename(parser);
            } else if (name.equals("version")) {
                version = readVersion(parser);
            } else if (name.equals("md5")) {
                md5 = readMd5(parser);
            } else if (name.equals("url")) {
                url = readUrl(parser);
            } else if (name.equals("href")) {
                href = readHref(parser);
            } else if (name.equals("description")) {
                description = readDescription(parser);
            } else if (name.equals("force")) {
                force = readForce(parser);
            } else if (name.equals("type")) {
                type = readType(parser);
            } else {
                skip(parser);
            }
        }
        Ads ads = new Ads(filename, version, md5, url, href, description, force, type);
        return  ads;

    }

    private String readType(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "type");
            String type = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "type");
            return type;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private boolean readForce(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "force");
            boolean force = readText(parser).equals("true");
            parser.require(XmlPullParser.END_TAG, ns, "force");
            return force;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private String readDescription(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "description");
            String description = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "description");
            return description;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String readHref(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "href");
            String href = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "href");
            return href;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String readUrl(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "url");
            String url = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "url");
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String readMd5(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "md5");
            String md5 = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "md5");
            return md5;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String readVersion(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "version");
            String version = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "version");
            return version;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String readFilename(XmlPullParser parser) {
        try {
            parser.require(XmlPullParser.START_TAG, ns, "filename");
            String filename = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "filename");
            return filename;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 对于标签title和summary,提取它们的文本值
    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
        String result = "";
        if (parser.next() == XmlPullParser.TEXT) {
            result = parser.getText();
            parser.nextTag();
        }
        return result;
    }
}

4、使用,

    private void getAds() { //页面里面需要数据时去请求
        myTask = new MyTask();
        myTask.execute();
    }
    
	private List<Ads> mAds = nullprivate static final String ADS_URL = "http://网络xml访问地址.xml";
    
	private class MyTask extends AsyncTask<String, Integer, List<Ads>> {
        @Override
        protected List<Ads> doInBackground(String... strings) {
            Log.d(TAG, "doInBackground.....MyTask start work");
            try {
                mAds = null;
                mAds = DownloadXmlTask.getData(ADS_URL);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return mAds;
        }

        @Override
        protected void onPostExecute(List<Ads> s) {
            Log.d(TAG, "onPostExecute.....MyTask work finish");
            if (s == null) {
                Log.w(TAG, "s >>>>> null" );
                return;
            }
			//根据需求自己处理数据就可以了
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值