接上一章,这一章我们介绍Dom解析,因为Dom是J2EE中用得比较多的解析器,这里解析方法跟J2EE方法是一样的,具体的样式跟以下这篇文章中的样式是一样的
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id = "1"> <status>大徙弟</status> <name>孙悟空</name> <tool>金箍棒</tool> <number>杀死了50只妖怪</number> </person> <person id = "2"> <status>二徙弟</status> <name>猪八戒</name> <tool>九齿钉耙 </tool> <number>杀死了40只妖怪</number> </person> <person id = "3"> <status>三徙弟</status> <name>沙和尚</name> <tool>降妖宝杖</tool> <number>杀死了30只妖怪</number> </person> </persons>
我们来看解析处的代码:
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; public class DomHandler { private InputStream input; private List<Person> persons; private Person person; public DomHandler() { } public DomHandler(InputStream input) { this.input = input; } public void setInput(InputStream input) { this.input = input; } public List<Person> getPersons(){ persons = new ArrayList<Person>(); try { //通过Dom工厂方法建立Dom解析器 DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(input); Element element = document.getDocumentElement(); //取得节点<person>的节点列表 NodeList personNodes =element.getElementsByTagName("person"); //节点长度 int length = personNodes.getLength(); for(int i = 0; i < length; i++){ //取得<person>的节点元素 Element personElement = (Element)personNodes.item(i); person = new Person(); //取得<person id="1">中的id属性值 person.setId(personElement.getAttribute("id")); //继续向下,取得子节点列表,如<status><name>等等 NodeList childnodes = personElement.getChildNodes(); int len = childnodes.getLength(); for(int j = 0 ; j < len ; j++){ //如果子节点是一个元素节点 if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){ //取得节点名称 String nodeName = childnodes.item(j).getNodeName(); //取得节点值 String nodeValue = childnodes.item(j).getFirstChild().getNodeValue(); if("status".equals(nodeName)){ person.setStatus(nodeValue); } if("name".equals(nodeName)){ person.setName(nodeValue); } if("tool".equals(nodeName)){ person.setTool(nodeValue); } if("number".equals(nodeName)){ person.setNumber(nodeValue); } } }//end for j persons.add(person); }//end for i return persons; } catch (Exception e) { e.printStackTrace(); } return null; } }
接着就是Activity的代码了:
import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.widget.ListView; import android.widget.SimpleAdapter; public class PullActivity extends Activity { private ListView listView; private SimpleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.xml_handler); listView = (ListView)findViewById(R.id.xml_list); try { //自完义适配方法 getAdapter(); } catch (Exception e) { e.printStackTrace(); } listView.setAdapter(adapter); } //自定义适配方法 private void getAdapter() throws Exception { List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); //这一部分就是刚才我们做测试用的部分 File SD_Files = Environment.getExternalStorageDirectory(); String file_path = SD_Files.getName() + File.separator + "persons.xml"; //PULL解析文档 // FileInputStream input = new FileInputStream(new File(file_path)); // PullHandler pullHandler = new PullHandler(input); // List<Person> persons = pullHandler.getPersons(); //SAX解析文档 // FileInputStream fis = new FileInputStream(new File(file_path)); // SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); // SaxHandler saxHandler = new SaxHandler(); // parser.parse(fis, saxHandler); // List<Person> persons = saxHandler.getPersons(); //Dom解析文档 FileInputStream fis = new FileInputStream(new File(file_path)); DomHandler domHandler = new DomHandler(fis); List<Person> persons = domHandler.getPersons(); //将persons中的数据转换到ArrayList<Map<String, String>>中,因为SimpleAdapter要用这个类型的数据进行适配 Map<String, String> map; for(Person p : persons){ map = new HashMap<String, String>(); map.put("id", p.getId()); map.put("status", p.getStatus()); map.put("name", p.getName()); map.put("tool", p.getTool()); map.put("number", p.getNumber()); lists.add(map); } //HashMap<String, String>中的key String[] from = {"id", "status", "name", "tool", "number"}; //list_item.xml中对应的控件ID int[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number}; adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to); } }
其实Dom有Android中还是用的比较少的,主要是考虑性能的问题,毕竟手机不比服务器或电脑啊。
下一章,我们将会介绍Json的解析方法,希望各位同学们认真学习。
呵呵,十月长假很快就结束了,又要努力工作和学习了。谢谢