Java中XML的四种解析方式(DOM , SAX , JDOM , DOM4J)

本文介绍了Java中XML的四种解析方式:DOM、SAX、JDOM和DOM4J。DOM解析通过父节点和子节点逐层解析XML;SAX是事件驱动的API,通过定义处理类解析XML;JDOM使用具体类代替接口处理XML;DOM4J与JDOM相似,但提供更方便的二次迭代获取深层节点。文章详细阐述了每种方式的步骤并提供了代码示例。
摘要由CSDN通过智能技术生成

本文以解析如下xml为例:

<?xml version="1.0" encoding="GB2312"?>
<china>
	
	<province name="河北省">
		<city>石家庄</city>
		<city>邯郸</city>
		<city>唐山</city>
		<city>张家口</city>
		<city>廊坊</city>
		<city>保定</city>
		<city>承德</city>
	</province>
	
	<province name="辽宁省">
		<city>沈阳</city>
		<city>大连</city>
		<city>鞍山</city>
		<city>抚顺</city>
		<city>铁岭</city>
	</province>
	
	<province name="山东省">
		<city>济南</city>
		<city>青岛</city>
		<city>威海</city>
		<city>烟台</city>
		<city>潍坊</city>
	</province>

	
</china>	

一、DOM:

该方式的思路是以父节点,子节点的形式,逐层去解析xml标签里的各层。

步骤:

1、首先导入xml文件;

2、通过父节点的名称(“province”)获取一个父节点数组(List)

3、利用for循环遍历每个父节点。

    3.1.1、利用NameNodeMap类将父节点里的属性放入一个数组中 attr_List。

    3.1.2、遍历attr_List数组,输出每个父节点的属性值

    3.2.1、利用.getChildNodes()方法,获取父节点下的子节点集合child_List.

    3.2.2、循环遍历出 子节点名+子节点值(此处应判断节点是否为元素节点Node.ELEMENT_NODE)

package com.yan.xml.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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;

public class DomTest {
	public static void main(String[] args) {
		File file = new File("cities.xml");
		FileInputStream fis = null;
		try {
			//导入需要解析的xml文件
			fis = new FileInputStream(file);
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.parse(fis);
			
			//通过父节点的名称(“province”)获取一个父节点数组(List)
			NodeList node_List = document.getElementsByTagName("province");
			System.out.println("该文件中共包括" + node_List.getLength() + "个省");
			
			//利用for循环遍历每个父节点。
			for (int i = 0; i < node_List.getLength(); i++) {
				System.out.println("===========开始解析第" + (i + 1)
						+ "个省================");

				Node book = node_List.item(i);
				//利用NameNodeMap类将父节点里的属性放入一个数组中 attr_List。
				NamedNodeMap attr_List = book.getAttributes();
				System.out.println("此省标签共有" + attr_List.getLength() + "个属性");
				//遍历attr_List数组,输出每个父节点的属性值
				for (int j = 0; j < attr_List.getLength(); j++) {
					Node attribures = attr_List.item(j);
					System.out.println("属性名 :" + attribures.getNodeName()
							+ " , 属性值 :" + attribures.getNodeValue());
				}
				
				//利用.getChildNodes()方法,获取父节点下的子节点集合child_List.
				NodeList child_List = book.getChildNodes();
				System.out.println("子节点共有 " + child_List.getLength() + " 个");
				
				//循环遍历出 子节点名+子节点值(此处应判断节点是否为元素节点Node.ELEMENT_NODE)
				for (int n = 0; n < child_List.getLength(); n++) {
					Node child = child_List.item(n);
					if (child.getNodeType() == Node.ELEMENT_NODE) {
						System.out.println("第" + (n + 1)/2 + "个子节点的节点名 :"
								+ child.getNodeName() + " ,节点值:"
								+ child.getFirstChild().getNodeValue());
					}
				}

				System.out.println("===========第" + (i + 1)
						+ "个省解析完毕================");
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch blo
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值