天天看点

Android演示使用DOM解析xml文件

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;
    }
}
           

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

  1. 通过DocumentBuilderFactory.newInstance()创建工厂;
  2. 通过工厂创建DocumentBuilder;
  3. 通过builder.parse得到一个Document对象,此时将文件加载到了内存中;
  4. 通过document.getDocumentElement()得到整个文档的root节点;
  5. 通过root.getElementsByTagName可以得到整个root的子节点;
  6. 子节点再查找孙子节点可以使用getChildNodes方法;
  7. 可以通过getNodeName().equals对比属性名称;
  8. 可以通过NodeList.item(i).getFirstChild().getNodeValue()得到属性值;