您的位置:首页 > 移动开发 > Android开发

Android演示使用DOM解析xml文件

2011-09-19 15:14 399 查看
Android下解析xml文件的三种方式分别是:SAX、DOM、PULL,本次主要讲解如何使用DOM方式:

这里使用的测试xml文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<ProjectSettings>
<CurrentProject>0</CurrentProject>
<Project>
<Name>FreeDemo</Name>
<RunningMode>1</RunningMode>
</Project>
</ProjectSettings>

解析代码如下:
package com.freesoft.utility.logger;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.freesoft.utility.IntWrapper;
import com.freesoft.utility.settings.ProjectSetting;

/**
* @author wangshaozhuang
*
*/
public class DOMConfigGetter {

/**
* @param is
*            输入流
* @return 项目设置
*/
public static ProjectSetting getConfig(InputStream is) {
ProjectSetting currentSetting = new ProjectSetting();
int currentProjectIndex = 0;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
Element root = document.getDocumentElement();
NodeList currentProjectNodeList = root.getElementsByTagName(ProjectSetting.CURRENTPROJECT_NAME);
if (currentProjectNodeList.getLength() != 1)
throw new ArrayIndexOutOfBoundsException();
else
currentProjectIndex = IntWrapper.wrap(currentProjectNodeList.item(0).getFirstChild().getNodeValue(), 0);

NodeList projectsNodeList = root.getElementsByTagName(ProjectSetting.PROJECT_NAME);
Node currentProjectNode = projectsNodeList.item(currentProjectIndex);
NodeList currentProjectSettingsNodeList = currentProjectNode.getChildNodes();
for (int i = 0; i < currentProjectSettingsNodeList.getLength(); i++ ) {
if (currentProjectSettingsNodeList.item(i).getNodeName().equals(ProjectSetting.RUNNINGMODE_NAME)) {
String value = currentProjectSettingsNodeList.item(i).getFirstChild().getNodeValue();
currentSetting.setRunningMode(IntWrapper.wrap(value, ProjectSetting.INVALID_MODE));
} else if (currentProjectSettingsNodeList.item(i).getNodeName().equals(ProjectSetting.NAME_NAME)) {
String value = currentProjectSettingsNodeList.item(i).getFirstChild().getNodeValue();
currentSetting.setName(value);
}
}

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return currentSetting;
}
}

分析整个解析过程,主要有如下思路:

通过DocumentBuilderFactory.newInstance()创建工厂;
通过工厂创建DocumentBuilder;
通过builder.parse得到一个Document对象,此时将文件加载到了内存中;
通过document.getDocumentElement()得到整个文档的root节点;
通过root.getElementsByTagName可以得到整个root的子节点;
子节点再查找孙子节点可以使用getChildNodes方法;
可以通过getNodeName().equals对比属性名称;
可以通过NodeList.item(i).getFirstChild().getNodeValue()得到属性值;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息