java中使用DOM方式解析XML文件

本文使用DOM的方式解析XML文件,代码如下:

package net.yedward.xml;

import java.io.IOException;

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

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

/**
 * 使用DOM方式解析XML
 * 
 * @author YEDWARD
 *
 */
public class DOMXMLTest {
	public static void main(String[] args) {
		// 创建DocumentBuilderFactory对象
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		try {
			// 创建一个DocumentBuilder对象
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			// 通过DocumentBuilder对象的parse方法加载sitemap.xml文件到Document对象
			Document document = documentBuilder.parse("http://yedward.net/sitemap.xml");
			NodeList urlList = document.getElementsByTagName("url");
			for (int i = 0; i < urlList.getLength(); i++) {
				Node url = urlList.item(i);
				// Element element = (Element) url;
				// element.getAttribute("id");
				NamedNodeMap attributes = url.getAttributes();
				// 遍历节点属性
				for (int j = 0; j < attributes.getLength(); j++) {
					Node attribute = attributes.item(j);
					System.out.println("属性名:" + attribute.getNodeName());
					System.out.println("属性值:" + attribute.getNodeValue());
				}
				// 解析url的子节点
				NodeList nodeList = url.getChildNodes();
				for (int k = 0; k < nodeList.getLength(); k++) {
					// 对于空格、换行这种TextNode,过滤掉
					if (nodeList.item(k).getNodeType() == Node.ELEMENT_NODE) {
						// 无法直接使用getNodeValue()获取到节点的值,因为文本值也是一个子节点
						// System.out.println(nodeList.item(k).getNodeName());
						System.out.println("<" + nodeList.item(k).getNodeName() + ">:"
								+ nodeList.item(k).getFirstChild().getNodeValue());
						// 如果该节点下不只是只有一个文本节点,可能第1个节点是其他节点,
						// 则使用上面的方式会获取不到,那么可以使用getTextContent()来获取文本内容,
						// 会将所有节点的文本内容获取到
						System.out.println("<" + nodeList.item(k).getNodeName() + ">:"
								+ nodeList.item(k).getTextContent());
					}
				}
			}

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

上面就是使用DocumentBuilder对象来解析XML文本,解析的时候注意下XML中节点的几种类型,如下图1所示:

节点类型

图1:节点类型

弄清楚了节点的类型,弄清了nodetype、nodevalue等,就可以比较清楚的了解怎么使用DOM的方式来解析XML。

本文标题:java中使用DOM方式解析XML文件

本文链接:http://yedward.net/?id=31

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章