Analyse de données XML Android


Introduction à cette section :

Dans les deux sections précédentes, nous avons examiné les méthodes de requête HTTP intégrées à Android : HttpURLConnection et HttpClient. Nous pensions à l'origine OkHttp. Il a été intégré et j'ai voulu expliquer l'utilisation de base d'Okhttp. Plus tard, j'ai découvert que j'avais encore besoin d'introduire un tiers, alors oubliez-le et mettez-le dans la partie avancée. Eh bien, dans cette section, nous découvrirons les trois solutions d'analyse des données XML fournies par Android ! Ils sont: Il existe trois méthodes d'analyse : SAX, DOM et PULL. Découvrons-les ci-dessous !


1. Introduction aux points clés des données XML

Tout d'abord, examinons quelques exigences et concepts des données XML :

1.png


2. Comparaison de trois méthodes d'analyse XML

2.png


3. 🎜>

3.pngCode principal

:

Classe d'analyse SAX:SaxHelper.java

:

/**
 * Created by Jay on 2015/9/8 0008.
 */
public class SaxHelper extends DefaultHandler {
    private Person person;
    private ArrayList persons;
    //当前解析的元素标签
    private String tagName = null;

    /**
     * 当读取到文档开始标志是触发,通常在这里完成一些初始化操作
     */
    @Override
    public void startDocument() throws SAXException {
        this.persons = new ArrayList();
        Log.i("SAX", "读取到文档头,开始解析xml");
    }


    /**
     * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
     */
    @Override
    public void startElement(String uri, String localName, String qName,
                             Attributes attributes) throws SAXException {
        if (localName.equals("person")) {
            person = new Person();
            person.setId(Integer.parseInt(attributes.getValue("id")));
            Log.i("SAX", "开始处理person元素~");
        }
        this.tagName = localName;
    }


    /**
     * 读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度
     */

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //判断当前标签是否有效
        if (this.tagName != null) {
            String data = new String(ch, start, length);
            //读取标签中的内容
            if (this.tagName.equals("name")) {
                this.person.setName(data);
                Log.i("SAX", "处理name元素内容");
            } else if (this.tagName.equals("age")) {
                this.person.setAge(Integer.parseInt(data));
                Log.i("SAX", "处理age元素内容");
            }

        }

    }

    /**
     * 处理元素结束时触发,这里将对象添加到结合中
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (localName.equals("person")) {
            this.persons.add(person);
            person = null;
            Log.i("SAX", "处理person元素结束~");
        }
        this.tagName = null;
    }

    /**
     * 读取到文档结尾时触发,
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.i("SAX", "读取到文档尾,xml解析结束");
    }

    //获取persons集合
    public ArrayList getPersons() {
        return persons;
    }

}
Ensuite, nous écrivons dans MainActivity. java Une telle méthode peut être appelée lors de l'analyse XML. C'est bien ~
private ArrayList readxmlForSAX() throws Exception {
    //获取文件资源建立输入流对象
    InputStream is = getAssets().open("person1.xml");
    //①创建XML解析处理器
    SaxHelper ss = new SaxHelper();
    //②得到SAX解析工厂
    SAXParserFactory factory = SAXParserFactory.newInstance();
    //③创建SAX解析器
    SAXParser parser = factory.newSAXParser();
    //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
    parser.parse(is, ss);
    is.close();
    return ss.getPersons();
}

Quelques autres mots

:

Eh bien, au fait, j'ai oublié de vous dire que nous définissons un fichier person1.xml comme celui-ci, et puis placez Dans le répertoire des actifs ! Le contenu du fichier est le suivant : person1.xml

            SAX解析        18                XML1        43
Nous combinons les trois méthodes d'analyse en une seule démo, nous ne publions donc tous les rendus qu'à la fin. Ici, l'imprimé. la version est publiée dans le journal, Je pense que tout le monde comprendra plus clairement le processus d'analyse XML SAX :

De plus, le texte vide à l'extérieur est également un nœud de texte ! Ces nœuds seront également parcourus lors de l'analyse ! 4.png

4. DOM analysant les données XML


5.pngCode principal

 :

DomHelper. java

/**
 * Created by Jay on 2015/9/8 0008.
 */
public class DomHelper {
    public static ArrayList queryXML(Context context)
    {
        ArrayList Persons = new ArrayList();
        try {
            //①获得DOM解析器的工厂示例:
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            //②从Dom工厂中获得dom解析器
            DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
            //③把要解析的xml文件读入Dom解析器
            Document doc = dbBuilder.parse(context.getAssets().open("person2.xml"));
            System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation());
            //④得到文档中名称为person的元素的结点列表
            NodeList nList = doc.getElementsByTagName("person");
            //⑤遍历该集合,显示集合中的元素以及子元素的名字
            for(int i = 0;i < nList.getLength();i++)
            {
                //先从Person元素开始解析
                Element personElement = (Element) nList.item(i);
                Person p = new Person();
                p.setId(Integer.valueOf(personElement.getAttribute("id")));

                //获取person下的name和age的Note集合
                NodeList childNoList = personElement.getChildNodes();
                for(int j = 0;j < childNoList.getLength();j++)
                {
                    Node childNode = childNoList.item(j);
                    //判断子note类型是否为元素Note
                    if(childNode.getNodeType() == Node.ELEMENT_NODE)
                    {
                        Element childElement = (Element) childNode;
                        if("name".equals(childElement.getNodeName()))
                            p.setName(childElement.getFirstChild().getNodeValue());
                        else if("age".equals(childElement.getNodeName()))
                            p.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));
                    }
                }
                Persons.add(p);
            }
        } catch (Exception e) {e.printStackTrace();}
        return Persons;
    }
}
Analyse du code

 :

À partir du code, nous pouvons voir le processus d'analyse XML du DOM. Tout d'abord, le fichier entier est lu dans. l'analyseur Dom, puis formez un arbre, Ensuite, nous pouvons parcourir la liste de nœuds pour obtenir les données dont nous avons besoin !

5.PULL analyse les données XML

6.png Utiliser PULL Le processus d'analyse des données XML

 :

7.pngCode principal

 :

public static ArrayList getPersons(InputStream xml)throws Exception
{
    //XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance();
    ArrayList persons = null;
    Person person = null;
    // 创建一个xml解析的工厂  
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
    // 获得xml解析类的引用  
    XmlPullParser parser = factory.newPullParser();  
    parser.setInput(xml, "UTF-8");  
    // 获得事件的类型  
    int eventType = parser.getEventType();  
    while (eventType != XmlPullParser.END_DOCUMENT) {  
        switch (eventType) {  
        case XmlPullParser.START_DOCUMENT:  
            persons = new ArrayList();  
            break;  
        case XmlPullParser.START_TAG:  
            if ("person".equals(parser.getName())) {  
                person = new Person();  
                // 取出属性值  
                int id = Integer.parseInt(parser.getAttributeValue(0));  
                person.setId(id);  
            } else if ("name".equals(parser.getName())) {  
                String name = parser.nextText();// 获取该节点的内容  
                person.setName(name);  
            } else if ("age".equals(parser.getName())) {  
                int age = Integer.parseInt(parser.nextText());  
                person.setAge(age);  
            }  
            break;  
        case XmlPullParser.END_TAG:  
            if ("person".equals(parser.getName())) {  
                persons.add(person);  
                person = null;  
            }  
            break;  
        }  
        eventType = parser.next();  
    }  
    return persons;  
}
Le processus de génération données XML à l'aide de Pull

 :

Code principal :

public static void save(List persons, OutputStream out) throws Exception {
    XmlSerializer serializer = Xml.newSerializer();
    serializer.setOutput(out, "UTF-8");
    serializer.startDocument("UTF-8", true);
    serializer.startTag(null, "persons");
    for (Person p : persons) {
        serializer.startTag(null, "person");
        serializer.attribute(null, "id", p.getId() + "");
        serializer.startTag(null, "name");
        serializer.text(p.getName());
        serializer.endTag(null, "name");
        serializer.startTag(null, "age");
        serializer.text(p.getAge() + "");
        serializer.endTag(null, "age");
        serializer.endTag(null, "person");
    }

    serializer.endTag(null, "persons");
    serializer.endDocument();
    out.flush();
    out.close();
}

6. Téléchargement d'un exemple de code :

Exécution du rendu  :

9.gif9.png10.png

Téléchargement du code : XMLParseDemo.zip : Téléchargez XMLParseDemo.zip


Résumé de cette section :

Cette section présente trois méthodes d'analyse XML couramment utilisées dans Android, DOM, SAX et PULL. Nous recommandons d'utiliser cette dernière pour les terminaux mobiles. Il en existe deux types, et PULL est plus simple à utiliser, je n'entrerai donc pas dans les détails ici. Le code est le meilleur professeur ~ C'est tout pour cette section. Venez apprendre la méthode d'analyse JSON fournie par Android ! Merci~