如何在android中解析下面提到的xml并将其存储在类中?

时间:2015-09-24 05:11:34

标签: android xml parsing

我需要解析下面的xml并将其存储在类中。

<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>

到目前为止,我所做的是,我曾经获取节点值,只是将其添加到hashmap的arraylist中,如下面显示的其他xml。

public class XmlParser {

    private static final String ns = null;

    /** This is the only function need to be called from outside the class */
    public static 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 readLabels(parser);
        }finally{

        }
    }        

    /** This method read each country in the xml data and add it to List */
    private static List<ArrayList<HashMap>> readLabels(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")){
                //do nothing
            }
            else if(name.equals("label"))
             {
                 list.add(readLabel(parser));
             }
            else
            {
                skip(parser);
            }
        }       
        return list;
    }

    /** This method read a country and returns its corresponding HashMap construct */
    private static ArrayList<HashMap> readLabel(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")) {
                textlan = parser.getAttributeValue(ns,"language");
                textval = parser.getAttributeValue(ns,"value");
                 String details =   "language : " + textlan  + "value : " + textval;
                 hm.put(labelid,details );
                 al.add(hm);
                 readText(parser);
             }
            else
             {
                skip(parser);
            }
        }
        return al;
    }


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


    private static 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;
            }
        }
     }
}

但对于这个特殊的xml,我需要将它存储在类中。你能否帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以从以下示例中获得建议。

main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SAXParserExample" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="@string/hello_world"
        android:textColor="#CC0033"
        android:textSize="16sp" />

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/text" />

</RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" />

Main.java

public class SAXParserExample extends Activity {

    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_saxparser_example);

        listView = (ListView) findViewById(R.id.list);

        List<Employee> employees = null;
        try {
            XMLPullParserHandler parser = new XMLPullParserHandler();
            employees = parser.parse(getAssets().open("employees.xml"));
            ArrayAdapter<Employee> adapter = 
                new ArrayAdapter<Employee>(this,R.layout.list_item, employees);
            listView.setAdapter(adapter);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.saxparser_example, menu);
        return true;
    }

}
资产文件夹中的

写入Employees.xml

<?xml version="1.0" encoding="UTF-8"?>
<employees>
    <employee>
        <id>2163</id>
        <name>Kumar</name>
        <department>Development</department>
        <type>Permanent</type>      
        <email>kumar@tot.com</email>
    </employee>
    <employee>
        <id>6752</id>
        <name>Siva</name>
        <department>DB</department>
        <type>Contract</type>       
        <email>siva@tot.com</email>
    </employee> 
    <employee>
        <id>6763</id>
        <name>Timmy</name>
        <department>Testing</department>
        <type>Permanent</type>      
        <email>timmy@tot.com</email>
    </employee>
</employees> 
Employee.java中的

public class Employee {

    private String name;
    private int id;
    private String department;
    private String type;
    private String email;

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

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

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return id + ": " + name + "\n" + department + "-" + type
                + "\n" + email;
    }
}

在XMLPullParserHandler.java等处理程序中

public class XMLPullParserHandler {
    List<Employee> employees;
    private Employee employee;
    private String text;

    public XMLPullParserHandler() {
        employees = new ArrayList<Employee>();
    }

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

    public List<Employee> parse(InputStream is) {
        XmlPullParserFactory factory = null;
        XmlPullParser parser = null;
        try {
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            parser = factory.newPullParser();

            parser.setInput(is, null);

            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();

                switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase("employee")) {
                        // create a new instance of employee
                        employee = new Employee();
                    }
                    break;

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

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("employee")) {
                        // add employee object to list
                        employees.add(employee);
                    } else if (tagname.equalsIgnoreCase("name")) {
                        employee.setName(text);
                    } else if (tagname.equalsIgnoreCase("id")) {
                        employee.setId(Integer.parseInt(text));
                    } else if (tagname.equalsIgnoreCase("department")) {
                        employee.setDepartment(text);
                    } else if (tagname.equalsIgnoreCase("email")) {
                        employee.setEmail(text);
                    } else if (tagname.equalsIgnoreCase("type")) {
                        employee.setType(text);
                    }
                    break;

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

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

        return employees;
    }
}