DOM方式解析文档,我们将解析后得到的数据显示在一个TextView中,代码示例:
public class ActivityMain extends Activity {
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextViewresult = (TextView)this.findViewById(R.id.resultText);
//读取xml文件
ListuserList = readXMLDOM();
//显示
StringBufferstrB = new StringBuffer();
for(Useru:userList){
strB.append(u.userId+","+u.userName+","+u.userAge+"\n");
}
result.setText(strB);
}
/**
* 解析文档
* @return
*/
privateList readXMLDOM() {
InputStreamis = null;
ListuserList = new ArrayList();
//获取一个解析DOM树的工厂
DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();
try {
//读取raw目录的xml文件
is= getResources().openRawResource(R.raw.dom);
//创建DOM文档对象
DocumentBuilderbuilder = factory.newDocumentBuilder();
//加载XML文档,将XML文件解析为Document
Documentdom = builder.parse(is);
//获取DOM文档的根元素
Elementroot = dom.getDocumentElement();
//查找所有user节点列表
NodeListitems = root.getElementsByTagName("user");
for(int i = 0; i < items.getLength(); i++) {
Useruser = new User();
//获取user节点
Elementnode = (Element) items.item(i);
//获取user节点的id属性值
user.userId= node.getAttribute("id");
//获取user节点下的所有子节点
NodeListchildsNodes = node.getChildNodes();
for(int j = 0; j < childsNodes.getLength(); j++) {
Node nodeChild = (Node)childsNodes.item(j);
//判断是否为元素类型
if(nodeChild.getNodeType() == Node.ELEMENT_NODE) {
ElementchildNode = (Element) nodeChild;
// 判断是否name元素
if("name".equals(childNode.getNodeName())) {
//获取name元素的内容
user.userName= childNode.getFirstChild().getNodeValue();
}else if ("age".equals(childNode.getNodeName())) {
user.userAge= childNode.getFirstChild().getNodeValue();
}
}
}
userList.add(user);
}
} catch(Exception e) {
e.printStackTrace();
}finally{
if(is!=null){
try{
//关闭输入流
is.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
returnuserList;
}
}
从上面代码中我们分析下DOM解析XML步骤:
(1)读取xml文件获取输入流对象;
(2)创建DocumentBuilderFactory 实例,得到解析器的工厂类;
(3)通过DocumentBuilderFactory 创建DocumentBuilder文档解析器;
(4)parse(InputStreamis) 方法将文档内容装入解析器;
(5)然后获取文档的根结点(Element);
(6)然后从根结点中获取我们关注的所有子节点的列表(NodeList);
(7)最后根据节点名称获取我们需要的数据。