除了可以使用 SAX解析XML文件,大家也可以使用熟悉的DOM来解析XML文件。 DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。
下面是本例子要解析的XML文件,保存在assets文件夹中:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>小明</name> <age>30</age> </person> <person id="20"> <name>小强</name> <age>25</age> </person> </persons>
例子定义了一个javabean用于存放上面解析出来的xml内容:
package com.example.xmldomparse; public class PersonBean { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.example.xmldomparse; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.example.xmlsaxparse.R; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { private List<PersonBean> persons; private TextView textView; private String notice = ""; private InputStream inStream; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.test); try { inStream = this.getAssets().open("test.xml"); } catch (IOException e) { e.printStackTrace(); } persons = readXML(inStream); for (int i = 0; i < persons.size(); i++) { notice += persons.get(i).getName() + persons.get(i).getAge(); } textView.setText(notice); } public static List<PersonBean> readXML(InputStream inStream) { List<PersonBean> persons = new ArrayList<PersonBean>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document dom = builder.parse(inStream); Element root = dom.getDocumentElement(); // 查找所有person节点 NodeList items = root.getElementsByTagName("person"); for (int i = 0; i < items.getLength(); i++) { PersonBean person = new PersonBean(); // 得到第一个person节点 Element personNode = (Element) items.item(i); // 获取person节点的id属性值 person.setId(Integer.valueOf(personNode.getAttribute("id"))); // 获取person节点下的所有子节点(标签之间的空白节点和name/age元素) NodeList childsNodes = personNode.getChildNodes(); for (int j = 0; j < childsNodes.getLength(); j++) { Node node = (Node) childsNodes.item(j); // 判断是否为元素类型 if (node.getNodeType() == Node.ELEMENT_NODE) { Element childNode = (Element) node; if ("name".equals(childNode.getNodeName())) { // 获取name元素下Text节点,然后从Text节点获取数据 person.setName(childNode.getFirstChild() .getNodeValue()); } else if ("age".equals(childNode.getNodeName())) { person.setAge(new Short(childNode.getFirstChild() .getNodeValue())); } } } persons.add(person); } inStream.close(); } catch (Exception e) { e.printStackTrace(); } return persons; } }