如何在到达一个xml节点的结束标记后继续解析?

时间:2015-09-24 14:51:29

标签: android xml parsing

我有xml如下。

<xml>
    <!-- Labels -->


    <labels>
        <label id="lblMS">
            <text language="EN" value="Morning Sync"/>
            <text language="DE" value="Morgan Sync"/>
        </label>
        <label id="lblES">
            <text language="EN" value="Evening Sync"/>
            <text language="DE" value="Sync Abend"/>
        </label>
        <label id="lblAS">
            <text language="EN" value="Afternoon Sync"/>
            <text language="DE" value="Sync Afternoon"/>
        </label>
    </labels>

    <syncgroupsettings>
        <syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
            <syncgroup syncgroupname = "VISITS"/>
            <syncgroup syncgroupname = "CUSTOMERS"/>
        </syncgroupset>

        <syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
            <syncgroup syncgroupname = "SALESDOCS"/>
            <syncgroup syncgroupname = "ANALYTICS"/>
        </syncgroupset>
    </syncgroupsettings>

</xml>

我正在解析xml的第一部分,即。标签部分。当我到达标签标签的末尾,而不是去下一个节点即。 syncgroupsettings它返回带有hashmap的数组列表。请找到如下代码。

import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class CountryXmlParser {

    private static final String ns = null;
    List<SyncGroupSettings> employees;
    private SyncGroupSettings employee;
    private String text;

    public CountryXmlParser() {
        employees = new ArrayList<SyncGroupSettings>();
    }

    public List<SyncGroupSettings> getEmployees() {
        return employees;
    }

    /** This is the only function need to be called from outside the class */
    public List<ArrayList<HashMap>> parse(Reader reader)
            throws XmlPullParserException, IOException{
        try{
            List<ArrayList<HashMap>> list = new ArrayList<ArrayList<HashMap>>();
            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);         
            parser.setInput(reader);
            parser.nextTag();           
            return readCountries(parser);           
        }finally{

        }
    }        

    /** This method read each country in the xml data and add it to List */
    private List<ArrayList<HashMap>> readCountries(XmlPullParser parser)
            throws XmlPullParserException,IOException{

        List<ArrayList<HashMap>> list = new ArrayList<ArrayList<HashMap>>();

        parser.require(XmlPullParser.START_TAG, ns, "xml");

        while(parser.next() != XmlPullParser.END_TAG) {
            if(parser.getEventType() != XmlPullParser.START_TAG){
                continue;
            }

            String name = parser.getName();         
            if(name.equals("labels")){

                //readCapital(parser);
            }
            else if(name.equals("label"))
             {
                 list.add(readCountry(parser));
             }
            else
            if(name.equals("syncgroupsettings"))
            {
                //do nothing
            }
            else
            if(name.equals("syncgroupset"))
            {
                parse(parser);
            }else

            {
                skip(parser);
            }
        }
        parse(parser);
        return list;
    }

    /** This method read a country and returns its corresponding HashMap construct */
    private ArrayList<HashMap> readCountry(XmlPullParser parser)
            throws XmlPullParserException, IOException{

        parser.require(XmlPullParser.START_TAG, ns, "label");

        String labelid = parser.getAttributeValue(ns, "id");
        String textlan = "";
        String textval="";


        ArrayList<HashMap> al=new ArrayList<HashMap>();
        HashMap<String, String> hm = new HashMap<String, String>();
        while(parser.next() != XmlPullParser.END_TAG){
            if(parser.getEventType() != XmlPullParser.START_TAG){
                continue;
            }

            String name = parser.getName();
             if(name.equals("text")) {
                //  labelid = parser.getAttributeValue(ns, "id");

                textlan = parser.getAttributeValue(ns,"language");
                textval = parser.getAttributeValue(ns,"value");
                 String details =   "Language : " + textlan + "\n" +
                         "Value : " + textval + "\n";
                 hm.put(labelid,details );
                 al.add(hm);
                 readCapital(parser);
             }
            else
             {
                skip(parser);
            }
        }

        return al;
    }


    /** Process Capital tag in the xml data */    
    private void readCapital(XmlPullParser parser) 
            throws IOException, XmlPullParserException {    
        parser.require(XmlPullParser.START_TAG, ns, "text");
        parser.nextTag();
    }


    private void skip(XmlPullParser parser) 
            throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
            case XmlPullParser.END_TAG:
                depth--;
                break;
            case XmlPullParser.START_TAG:
                depth++;
                break;
            }
        }
     }


    public List<SyncGroupSettings> parse(XmlPullParser parser) {
        String id = "";
        String labelid="";
        String enabled = "";
        String default1 = "";
        String syngroupname = "";

        try {
            parser.require(XmlPullParser.START_TAG, ns, "syncgroupsettings");
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if (tagname.equalsIgnoreCase("syncgroupset")) {
                            // create a new instance of employee
                            employee = new SyncGroupSettings();
                            employees.add(employee);
                            id = parser.getAttributeValue(ns,"id");
                            labelid = parser.getAttributeValue(ns,"labelid");
                            enabled = parser.getAttributeValue(ns,"enabled");
                            default1 = parser.getAttributeValue(ns,"default");
                            employee.setId(id);
                            employee.setLabelId(labelid);
                            employee.setSynDefault(enabled);
                            employee.setSynEnabled(default1);
                        }else
                       if (tagname.equalsIgnoreCase("syncgroup")) {
                            ArrayList<SyncGroupSettings.Item> syngrp =new ArrayList<SyncGroupSettings.Item>();
                            syngroupname = parser.getAttributeValue(ns,"syncgroupname");
                            readSyncgroup(parser);
                            // employee.setName(text);
                        }
                        break;

                    case XmlPullParser.TEXT:
                        text = parser.getText();
                        break;

                    case XmlPullParser.END_TAG:
                        break;

                    default:
                        break;
                }
                eventType = parser.next();
            }

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return employees;
    }

    /** Process Capital tag in the xml data */
    private void readSyncgroup(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "syncgroup");
        parser.nextTag();
    }
}

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您只检查根节点,而不是其中的节点,您需要循环查找节点是否在您的根节点内

**首先KEY_ITEM值将为labels,然后再次使用syncgroupsettings来获取分支元素,同样内部循环KEY_ID将是分支名称,就像第一次一样将是label然后syncgroupset **

  XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // getting XML
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_ITEM);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                list.add(map);
            }

查看本教程:Parsing Xml in Android