Android XML文件解析

一.xml數據格式

 

2、生成XML文件

2.1 Person類

public class Person {
    private int id;
    private int age;
    private String name;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

 

 

2.2 生成XML文件

 public static void createXml(Context context,List<Person> list) {
        XmlSerializer serializer=Xml.newSerializer();//xml文件生成器
        File file=new File(Environment.getExternalStorageDirectory(),"person.xml");
        FileOutputStream fos=null;

        try {
            fos=new FileOutputStream(file);
            serializer.setOutput(fos,"utf-8");//爲xml生成器設置輸出流和字符編碼
            serializer.startDocument("utf-8",true);//開始文檔,參數分別爲字符編碼和是否保持獨立
            serializer.startTag(null,"persons");//開始標籤,參數分別爲:命名空間和標籤名
            for(Person person:list){
                serializer.startTag(null,"person");
                serializer.attribute(null,"id",person.getId()+"");

                serializer.startTag(null,"name");//開始標籤
                serializer.text(person.getName());//文本內容
                serializer.endTag(null,"name");//結束標籤

                serializer.startTag(null,"sex");
                serializer.text(person.getSex());
                serializer.endTag(null,"sex");


                serializer.startTag(null,"age");
                serializer.text(person.getAge()+"");
                serializer.endTag(null,"age");

                serializer.startTag(null,"address");
                serializer.text(person.getAddress());
                serializer.endTag(null,"address");

                serializer.endTag(null,"person");
            }

            serializer.endTag(null,"persons");//結束標籤
            serializer.endDocument();//結束xml文檔
            Toast.makeText(context.getApplicationContext(),"生成成功!",Toast.LENGTH_SHORT).show();

        } catch (IOException e) {
            Toast.makeText(context.getApplicationContext(),"生成失敗!",Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

 

3、XML文件解析

3.1 pull方式

//pull方式解析XML文件
    public static List<Person> parseXMLWithPull(File xmlData){

        try {
            FileInputStream fis=new FileInputStream(xmlData);
            List<Person> list=null;
            Person person=null;

            //獲取xml pull解析器
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser=factory.newPullParser();
            xmlPullParser.setInput(fis,"utf-8");//參數分別爲輸入流和字符編碼

            int eventType=xmlPullParser.getEventType();
            while(eventType!=XmlPullParser.END_DOCUMENT){//若是事件不等於文檔結束事件就繼續循環
                switch (eventType){
                    case XmlPullParser.START_TAG:
                        if("persons".equals(xmlPullParser.getName())){
                            list=new ArrayList<>();
                        }else if("person".equals(xmlPullParser.getName())){
                            person=new Person();
                            person.setId(Integer.valueOf(xmlPullParser.getAttributeValue(0)));
                        }else if("name".equals(xmlPullParser.getName())){
                            person.setName(xmlPullParser.nextText());
                        }else if("sex".equals(xmlPullParser.getName())){
                            person.setSex(xmlPullParser.nextText());
                        }else if("address".equals(xmlPullParser.getName())){
                            person.setAddress(xmlPullParser.nextText());
                        }else if("age".equals(xmlPullParser.getName())){
                            person.setAge(Integer.valueOf(xmlPullParser.nextText()));
                        }
                        break;

                    case XmlPullParser.END_TAG:
                        if("person".equals(xmlPullParser.getName())){
                            list.add(person);
                            person=null;
                        }
                        break;

                }
                eventType=xmlPullParser.next();
            }
            return list;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (XmlPullParserException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

 

3.2 sax方式解析

//SAX方式解析XML文件
    public static List<Person> parseXMLWithSAX(File xmlData){
        try {
            SAXParserFactory factory=SAXParserFactory.newInstance();//建立SAX解析工廠
            SAXParser saxParser=factory.newSAXParser();//建立SAX解析器
            SAXHandler handler=new SAXHandler();//建立處理函數
            saxParser.parse(xmlData,handler);//開始解析
            List<Person> list= handler.getPersons();//獲取返回數據
            return list;
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            return null;
        } catch (SAXException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    //SAX處理類
    private static class SAXHandler extends DefaultHandler{
        private List<Person> list=null;
        private Person person=null;
        private String nodeName="";//當前解析的標籤

        //返回解析結果
        public List<Person> getPersons(){
            return list;
        }

        //文檔開始
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            list=new ArrayList<>();
        }

        //文檔結束
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }

        //節點開始標籤
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            nodeName=localName;
            if("person".equals(localName)){
                person=new Person();
                person.setId(Integer.valueOf(attributes.getValue("id")));
            }

        }

        //節點結束標籤
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if("person".equals(localName)){
                list.add(person);
                person=null;
            }
            nodeName="";
        }

        //文本數據  若是標籤存在換行也會進入該方法,可是data數據爲null,記得作非空判斷"
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            String data=new String(ch,start,length);
            if(!TextUtils.isEmpty(data)&&!TextUtils.isEmpty(nodeName)){
                return;
            }
            if("age".equals(nodeName)){
                person.setAge(Integer.valueOf(data));
            }else if("address".equals(nodeName)){
                person.setAddress(data);
            }else if("name".equals(nodeName)){
                person.setName(data);
            }else if("sex".equals(nodeName)){
                person.setSex(data);
            }
        }
    }

3.3 Dom解析XML文件 node

  //DOM解析XML文件
    private List<Person> parseXMLWithDom(File xmlData){
        List<Person> list=new ArrayList<>();

        try {
            //得到工廠對象,以及經過DOM工廠對象獲取DOMBuilder對象
            DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
            DocumentBuilder builder=factory.newDocumentBuilder();

            //解析XML輸入流,獲得Document對象,表示一個XML文檔
            InputStream fis=getAssets().open("person.xml");
            Document document=builder.parse(xmlData);

            //獲取文檔中的根節點persons
            Element element=document.getDocumentElement();

            //獲取Element下一級的person節點集合,以及NodeList的形式存放
            NodeList peronsNodes=element.getElementsByTagName("person");
            for(int i=0;i<peronsNodes.getLength();i++){
                //循環獲取索引爲i的person節點
                Element personElement= (Element) peronsNodes.item(i);
                Person person=new Person();

                //經過屬性名,獲取節點的屬性id
                person.setId(Integer.parseInt(personElement.getAttribute("id")));

                //獲取索引i的person節點下的子節點集合
                NodeList childNodes=personElement.getChildNodes();

                for (int j=0;j<childNodes.getLength();j++){
                    //循環遍歷每一個person下的子節點,若是判斷節點類型是ELEMENT_NODE,就能夠依據節點名稱給予解析
                    if(childNodes.item(j).getNodeType()== Node.ELEMENT_NODE){
                        if("name".equals(childNodes.item(j).getNodeName())){
                            //由於文本也是一個文本節點,因此這裏讀取到那麼節點的時候,經過getFirstChild()能夠直接得到
                            //name節點下的第一個節點,就是name節點後的文本節點,取其value值,就是文本的內容
                            person.setName(childNodes.item(j).getFirstChild().getNodeValue());
                        }else if("age".equals(childNodes.item(j).getNodeName())){
                            person.setAge(Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue()));
                        }else if("address".equals(childNodes.item(j).getNodeName())){
                            person.setAddress(childNodes.item(j).getNodeValue());
                        }else if("sex".equals(childNodes.item(j).getNodeName())){
                            person.setSex(childNodes.item(j).getNodeValue());
                        }
                    }
                }
                //把解析到的person對象添加到list中
                list.add(person);
            }
            return list;
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

        return null;
    }
相關文章
相關標籤/搜索