Android Studio中解析XML的方法 及需要避免的

提前创建一个xml文件
命名为weather.xml 用来代替服务器 传入的内容
内容

<?xml version="1.0" encoding="utf-8"?>
<weather>
	<channel id="1">
		<city>北京</city>
		<temp>25°</temp>
		<wind>3</wind>
		<pm250>300</pm250>
	</channel>
		<channel id="2">
		<city>汕头</city>
		<temp>20°</temp>
		<wind>4</wind>
		<pm250>50</pm250>
	</channel>
		<channel id="3">
		<city>广州</city>
		<temp>30°</temp>
		<wind>4</wind>
		<pm250>100</pm250>
	</channel>
		<channel id="4">
		<city>深圳</city>
		<temp>25°</temp>
		<wind>1</wind>
		<pm250>50</pm250>
	</channel>
	
</weather>

android studio 创建一个项目是不会创建 assets 资产管理文件的
所以要我们自己创建 (eclipse是会自动创建的)在app文件夹右键
在这里插入图片描述
以上创建过程
创建完在src/main/下就会出现assets文件夹在这里插入图片描述
然后添加开头的weather.xml文件
进入activity_main.xml
默认都会有这一句
在这里插入图片描述
在这里插入图片描述
然后添加
在这里插入图片描述
转到MainActivity.java文件
路径src\main\java\下

在这里插入图片描述
添加这一句findViewById(R.id.tv_weather); 找到我们之前修改的文本
在这里插入图片描述
实质是一个TextView 通过强制类型转换变成一下
在这里插入图片描述
这一步是为了显示信息
然后我们做一个解析的工具类 单独抽出来
命名为WeatherParser 返回值为List 看到这个就知道 我们要单独创建一个对象Channel
对象内容对应着我们创建的weather.xml
在这里插入图片描述

public class WeatherParser {

    public static List<Channel> parserXml(InputStream in) throws Exception{
        List<Channel> weatherLists = null;

        Channel channel = null;
// 1获取Xmlpullparser解析的实例
        XmlPullParser parser = Xml.newPullParser();

//        2设置Xmlpullparser 的参数
        parser.setInput(in,"utf-8");

        //获取事件类型
        int type = parser.getEventType();

        while(type!=XmlPullParser.END_DOCUMENT){
            switch (type){
                case XmlPullParser.START_DOCUMENT:
                    //具体判断一下解析
                    weatherLists = new ArrayList<Channel>();
                    break;
                case XmlPullParser.START_TAG://解析开始标签
                     if("channel".equals(parser.getName())){
                        channel = new Channel();
                        String id = parser.getAttributeName(0);
                        channel.setId(id);
                    }else if("city".equals(parser.getName()) ){
                        //获取标签的下一个  不是getText()他直接就取了city作为值
                        String city = parser.nextText();
                        channel.setCity(city);
                    }else if("temp".equals(parser.getName()) ){
                        String temp = parser.nextText();
                        channel.setTemp(temp);
                    }else if("wind".equals(parser.getName()) ){
                        String wind = parser.nextText();
                        channel.setWind(wind);
                    }else if("pm250".equals(parser.getName()) ){
                        String pm250 = parser.nextText();
                        channel.setPm250(pm250);
                    }
                    break;
                case XmlPullParser.END_TAG://解析结束标签
                    if("channel".equals(parser.getName())){
                        weatherLists.add(channel);
                    }
                    break;
            }

            type = parser.next();
        }

        return weatherLists;
    }
}

这里是分割线--------------------------------------------------------------------------


/**
 * Created by HAHA on 2018/9/25.
 */

public class Channel {
//这对应着我们创建的weather.xml 里面的内容
    private String id;
    private String city;
    private String temp;
    private String wind;
    private String pm250;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getWind() {
        return wind;
    }

    public void setWind(String wind) {
        this.wind = wind;
    }

    public String getPm250() {
        return pm250;
    }

    public void setPm250(String pm250) {
        this.pm250 = pm250;
    }

    @Override
    public String toString() {
        return "Channel{" +
                "id='" + id + '\'' +
                ", city='" + city + '\'' +
                ", temp='" + temp + '\'' +
                ", wind='" + wind + '\'' +
                ", pm250='" + pm250 + '\'' +
                '}';
    }
}

如果对WeatherParser有不懂的可以对应文档中的
https://developer.android.google.cn/reference/org/xmlpull/v1/XmlPullParser
这里面有官方代码 可以参考
在这里插入图片描述
要特别注意这两个地方 第一个是要单独抽出来
第二个看注释
到这里解析工具就完成
开始将数据展示到TextView上 回到MainActivity里

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            // 1.显示信息
            TextView tv_weather = (TextView) findViewById(R.id.tv_weather);
            //1.1获取资产管理者 通过上下文
            InputStream inputStream = getAssets().open("weather.xml");
            List<Channel> weatherlists = WeatherParser.parserXml(inputStream);
            StringBuffer sb = new StringBuffer();
            for (Channel channel:weatherlists){
                sb.append(channel.toString());
            }
            tv_weather.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

在这里插入图片描述
然后点击运行
在这里插入图片描述
显示成功

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Android Studio ,可以使用 SAX 解析解析 XML 文件。SAX 解析器是一种基于事件的解析器,它可以将 XML 文件解析为一系列事件,然后通过监听这些事件来获取所需的数据。 以下是使用 SAX 解析解析 XML 文件的示例代码: ```java public class MyHandler extends DefaultHandler { private String currentValue; private boolean parsingName; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equals("name")) { parsingName = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (parsingName) { // 处理姓名数据 parsingName = false; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (parsingName) { currentValue = new String(ch, start, length); } } } // 在 Activity 使用 SAX 解析器 try { InputStream inputStream = getResources().openRawResource(R.raw.my_xml_file); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); MyHandler handler = new MyHandler(); saxParser.parse(inputStream, handler); } catch (Exception e) { e.printStackTrace(); } ``` 在上面的示例代码,MyHandler 类继承了 DefaultHandler 类,并重写了 startElement()、endElement() 和 characters() 方法来监听 XML 文件的事件。在 startElement() 方法,可以判断当前解析的标签是否是所需的标签,并进行相应的处理;在 endElement() 方法,可以完成对标签数据的处理;在 characters() 方法,可以获取标签文本内容。 在 Activity ,可以使用 SAXParserFactory 类和 SAXParser 类来创建和使用 SAX 解析器。在调用 saxParser.parse() 方法时,需要传入要解析XML 文件的输入流和事件处理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingeho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值