美文网首页
Android pull方式解析xml文件

Android pull方式解析xml文件

作者: 穿梭侠 | 来源:发表于2018-06-28 19:37 被阅读0次

    今天我们将学习一下通过pull方式解析xml文件的方法
    首先,我们需要准备好一个xml文件,xml文件方面的知识我就不多说了,下面时我准备的xml文件的内容,当然你也可以自己准备一个

    <?xml version="1.0" encoding="utf-8"?>
    <begin>
      <student>
        <id>001</id>
        <name>aaa</name>
        <grade>90</grade>
      </student>
      <student>
        <id>002</id>
        <name>bbb</name>
        <grade>91</grade>
      </student>
      <student>
        <id>003</id>
        <name>ccc</name>
        <grade>92</grade>
      </student>
      <student>
        <id>004</id>
        <name>ddd</name>
        <grade>93</grade>
      </student>
    </begin>
    

    另外我们需要搭建一个Web服务器,而我选择使用的时Tomcat,你也可以使用其他的服务器。

    先将准备好的xml文件放在tomcat/webapps/ROOT下面,然后我们在浏览器中输入xml文件的地址,检查下是否能正确打开


    image.png

    可以看到,确实是没有问题,接下来我们就要进行编写代码了

    首先对布局文件没有要求,因为我是让其结果显示在logcat里面的
    下面是运行结果


    image.png

    我使用的是OkHttp工具从服务器获取到xml文件的内容的
    https://github.com/square/okhttp
    这是OkHttp工具的下载网址,具体用法我就不多说了。

    首先我们先使用OkHttp工具从服务器获取xml文件内容

     OkHttpClient client=new OkHttpClient();
     String url="http://*.*.*.*:*/testPull.xml";
     Request request=new Request.Builder().url(url).build();
     Response response=client.newCall(request).execute();
     String s=response.body().string();
    

    值得注意的是,上面url内的地址:...是指的ip地址,由于我们搭建的服务器的服务端是本机,客户端也是本机,所以ip地址填写本机的ip地址就行。还不知道本机ip地址的话就打开命令行,输入ipconfig查看一下把。

    而冒号后面的那个*是指我的tomcat的端口号,输入自己的端口号就好了

    注意,从服务器获取内容属于耗时操作,所以别忘了在子线程中进行

    这里我们已经获取到了xml文件的内容,并将内容赋值给了s,接下来我们就要对s里面的内容进行处理了

    我们解析xml文件需要用到的工具就是XmlPullParser,但是这个工具不能直接new出来,所以我们先要定义一个XmlPullParserFactory这样的一个工厂,让其为我们生产一个XmlPullParser出来,具体代码如下:

    XmlPullParserFactor factor=XmlPullParserFactor.new Instance();
    XmlPullParser parser=factor.newPullParser();
    

    好了,工具我们已经建好了,接下来就要使用工具了。
    首先我们要先给parser里面添加进内容:

    parser.setInput(new StringReader(s));
    

    然后我们在定义如下4个属性:

    String id,name,grade;
    int type;
    

    前三个应该不用我多说什么,就是放每一个学生的属性。
    type的作用就是用来存放获取到的内容的类型
    首先我们为type赋上值:

    type=parser.getEventType();
    

    赋上值以后我们就要根据type的类型来进行判断,从而进行不同的操作了:

    Log.d("result","id--name--grade");
    while(type!=XmlPullParser.END_DOCUMENT){
        String nodeName=parser.getName();
        switch(type){
            case XmlPullParser.START_TAG:
                if(nodeName.equals("id"){
                    id=parser.nextText();
                }else if(nodeName.equals("name"){
                    name=parser.nextText();
                }else if(nodeName.equals("grade"){
                    grade=parser.nextText();
                }
                break;
            case XmlPullParser.END_TAG){
                if(nodeName.equals("student"){
                    Log.d(“result",id+"--"+name+"--"+grade);
                }
            }
        }
        type=parser.next();
    }
    

    好了这样就完工了,下面附上完整代码:

    public class MainActivity extends AppCompatActivity {
    
    
    private List<Student> list=new ArrayList<Student>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        f1();
    }
    private void f1(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client=new OkHttpClient();
                    String url="http://10.12.62.242:8099/testPull.xml";
                    Log.d("haha",url);
                    Request request=new Request.Builder().url(url).build();
                    Response response=client.newCall(request).execute();
                    String s=response.body().string();
                    f2(s);
                } catch (IOException e) {
                    Log.d("haha",e.getMessage());
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private void f2(String s) {
        Log.d("ss2:",s);
        try {
            XmlPullParserFactory factor=XmlPullParserFactory.newInstance();
            XmlPullParser parser=factor.newPullParser();
            parser.setInput(new StringReader(s));
            String id=null,name=null,grade=null;
            int type=parser.getEventType();
            Log.d("result","id--name--grade");
            while(type!=XmlPullParser.END_DOCUMENT) {
                String nodeName=parser.getName();
                switch (type) {
                    case XmlPullParser.START_TAG:
                        if (nodeName.equals("id")) {
                            id = parser.nextText();
                        } else if (nodeName.equals("name")) {
                            name = parser.nextText();
                        } else if (nodeName.equals("grade")) {
                            grade = parser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (nodeName.equals("student")) {
                            Log.d("result",id+"--"+name+"--"+grade);
                        }
                        break;
                    default:
                        break;
                }
                type=parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }
    

    今天的学习就到此为止了,谢谢大家!

    相关文章

      网友评论

          本文标题:Android pull方式解析xml文件

          本文链接:https://www.haomeiwen.com/subject/kcsnyftx.html