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()得到属性值;