XML解析之DOM

   DOM解析XML文件是比较常用的手法,它会在内存中建立一个DOM树,通过一层层的迭代获取需要的数据。

下面是一个demo:

package com.app.dom;

import java.io.File;

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;
import org.w3c.dom.Text;

public class DomTest1 {

	public static void main(String[] args) throws Exception {
		// 第一步:获取DoucmenyBuilder
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();

		// 第二部:解析xml文件获取document
		Document document = builder.parse(new File("src/font.xml"));

		// 第三部:调用getDocumentElement获取根元素
		Element root = document.getDocumentElement();

		NodeList nodeList = root.getChildNodes();
		for (int i = 0; i < nodeList.getLength(); i++) {
			Node node = nodeList.item(i);
			if (node instanceof Element) {
				NodeList sNodeList = node.getChildNodes();
				for (int j = 0; j < sNodeList.getLength(); j++) {
					Node myNode = sNodeList.item(j);
					if (myNode instanceof Element) {
						String name = myNode.getNodeName();
						// String value = myNode.getFirstChild().getNodeValue();
						String value = ((Text) (myNode.getFirstChild()))
								.getData().trim();
						if (name.equals("name")) {
							System.out.print("name:" + name);
							System.out.println("   value:" + value);
						}
						if (name.equals("size")) {
							Element myElement = (Element) myNode;
							// 获取属性
							String attrValue = myElement.getAttribute("unit");
							System.out.print("size:" + name);
							System.out.print("   value:" + value);
							System.out.println("  attr:" + attrValue);
						}
					}
				}
			}
		}
	}

}


这里需要注意的一点是,对于一个Element节点中,它的childNode是包含空白节点的,所以判断一个节点是否是XML文件中的一个元素,必须使用node instanceof Element来检验。


DOM解析的优点是:层次非常的清晰。缺点也很明显,如果XML的层次很深,需要进行多次的循环才可以拿到数据。

你可能感兴趣的:(java,dom)