接上一章,这一章我们介绍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>
其他数据或样式请看以下教程
Android[中级教程]第五章 XML解析之PULL解析器
- 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_r("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.getExternalStorageDirect ory(); -
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的解析方法,希望各位同学们认真学习。