【问题标题】:How to parse the below mentioned xml in android and store it in the class?如何在android中解析下面提到的xml并将其存储在类中?
【发布时间】:2015-09-24 05:11:33
【问题描述】:

我有一个要求,我需要解析下面的 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 的数组列表中,如下所示其他 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,我需要将它存储在类中。你能帮我解决这方面的问题吗?

【问题讨论】:

    标签: android xml parsing


    【解决方案1】:

    你可以从下面的例子中得到灵感。

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

    【讨论】:

    • 感谢甘帕特。但是我的 xml 文件包含两个重复的子节点。 这个怎么处理?
    • 你可以使用 if
    • 对不起,我没明白,请您详细说明一下
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多