pull解析器

作者: 颤抖的闪电 | 来源:发表于2018-01-22 15:57 被阅读0次

    前言:Android中集成了pull解析器,所以从侧面凸显比较推荐使用pull解析器。以下演示了使用pull解析xml文件的过程,简单易懂,稍作修改就可以使用。

    我将解析文件person.xml存放于assets目录下
    解析XML内容:

    <?xml version="1.0" encoding="utf-8"?>
    <persons>
        <person id= "23">
            <name>liming</name>
            <age>30</age>
        </person>
        <person id= "20">
            <name>zahngxiaoxiao</name>
            <age>25</age>
        </person>
    </persons>
    
    作者:枫羽望空
    链接:https://www.jianshu.com/p/066f60b76d41
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    解析类PersonService类代码:

    /**
     * Created by Administrator on 2016/12/2.
     */
    public class PersonService {
    
        public static List<Person> getPersonXML (InputStream xml) throws Exception{
            List<Person> persons = null;
            Person person = null;
            //可通过pull解析器工场得到实例方法==》 XmlPullParserFactory.newInstance().newPullParser();
            XmlPullParser pullParser = Xml.newPullParser();//通Xml过帮助类获得pull解析器实例
            pullParser.setInput(xml,"UTF-8");//为pull解析器设置要解析的XML数据
            /**分析:
             * pull解析器会将数据读到一个 char[] = {-<..XML..>-}中
             * pull解析器会自动读取开始段(及第一段“<?xml version="1.0" encoding="utf-8"?>”)类容,
             * 从而判断是否符合XML开始类容的某一个语法,并触发对应语法所对应的事件
             */
            int exent = pullParser.getEventType();//第一个事件及开始的事件
            while (exent != XmlPullParser.END_DOCUMENT){
                switch (exent){
                    case XmlPullParser.START_DOCUMENT://DOCUMENT(开始事件)
                        persons = new ArrayList<Person>();
                        break;
                    case XmlPullParser.START_TAG: //节点开始的TAG
                        if ("person".equals(pullParser.getName())){
                            int id = Integer.parseInt(pullParser.getAttributeValue(0));//获取id
                            person = new Person();
                            person.setId(id);
                        }
                        if ("name".equals(pullParser.getName())){ //获取name
                           String name = pullParser.nextText();
                            person.setName(name);
                        }
                        if ("age".equals(pullParser.getName())){ //获取age
                            int age = Integer.parseInt(pullParser.nextText());
                            person.setAge(age);
                        }
                        break;
                    case XmlPullParser.END_TAG: //节点结束的TAG
                        if ("person".equals(pullParser.getName())){
                            persons.add(person);
                            person = null;
                        }
                        break;
    
                }
                //当解析完开始事件之后,PLL解析器不会主动向下解析,
                // 需要调用如下(.next())API,调用一次向下解析一步
                exent = pullParser.next();
            }
            return persons;
        }
    }
    
    作者:枫羽望空
    链接:https://www.jianshu.com/p/066f60b76d41
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    解析类容生成子类的person类代码:

    /**
     * Created by Administrator on 2016/12/2.
     */
    public class Person {
    
        private int id;
        private String name ;
        private int age;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    作者:枫羽望空
    链接:https://www.jianshu.com/p/066f60b76d41
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    Activity代码:

    public class XMLParsePullActivity extends AppCompatActivity {
    
        TextView xml_parse_text ;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            init();
            xmlParse();
        }
    
        private void init(){
            setContentView(R.layout.activity_xmlparse_pall);
            xml_parse_text = (TextView) findViewById(R.id.xml_parse_text);
        }
    
        private void xmlParse(){
    
            try {
                InputStream xml = this.getResources().getAssets().open("person.xml");// 获取assets下XM文件输出流
               List<Person> persons = PersonService.getPersonXML(xml);
                for (Person person : persons ){
                    String text = xml_parse_text.getText()+" \n id:"+person.getId()+"\n name:"+person.getName()+"\nage:"+person.getAge();
                    Log.d("FLY",text);
                    xml_parse_text.setText(text);
                }
            } catch (Exception e) {
                Log.d("FLY","出错了"+e);
                e.printStackTrace();
            }
        }
    }
    
    作者:枫羽望空
    链接:https://www.jianshu.com/p/066f60b76d41
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    全文结束。

    感谢:
    Android XML文件解析之pull解析器

    相关文章

      网友评论

        本文标题:pull解析器

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