【XML】使用DOM解析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.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 使用DOM解析XML文件
 * @author admin
 *
 */
public class Main {

	public static void main(String[] args) {
		//创建一个DocumentBuilderFactory的对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		try {
			//创建DocumentBuilder的对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			//通过DocumentBuilder的对象的parse方法加载book.xml到当前目录下
			Document document = db.parse("demo/book.xml");
			//获取所有的book节点的集合
			NodeList bookList = document.getElementsByTagName("book");
			//通过NodeList的getLength()方法获取bookList的长度
			System.out.println("一共有:"+bookList.getLength()+"本书");
			for(int i=0;i<bookList.getLength();i++){
				System.out.println("下面开始遍历第"+(i+1)+"本书的内容");
				
				//通过item(i)获取获取一个book节点
				Node book = bookList.item(i);
				//获取book节点的所有属性的集合
				NamedNodeMap attrs = book.getAttributes();
				System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性");
				//遍历book的属性
				for(int j=0;j<attrs.getLength();j++){
					//通过item(index)方法获取book节点的某个属性
					Node attr = attrs.item(j);
					//获取属性名
					System.out.print("属性名:"+attr.getNodeName()+",");
					//获取属性值
					System.out.println("属性值:"+attr.getNodeValue());	
				}
				
				
				/*
				 * 在知道book的属性值的情况下可以用以下方法遍历,并且有且只有一个id属性
				 * 将book节点进行强制类型转换为Element类型
				Element book = (Element) bookList.item(i);
				String attrValue = book.getAttribute("id");
				System.out.println("id的属性值为"+attrValue);
				*/
				
				//解析book节点的子节点
				NodeList childNodes = book.getChildNodes();
				//遍历childNodes获取每个节点的节点名和节点值
				System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子节点");
				for(int k=0;k<childNodes.getLength();k++){
					//区分出text类型的node以及element类型的node
					if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
						//获取了element类型节点的节点名
						System.out.print("节点名:"+childNodes.item(k).getNodeName()+",");
						//System.out.println("节点值:"+childNodes.item(k).getFirstChild().getNodeValue());
						System.out.println("节点值:"+childNodes.item(k).getFirstChild().getTextContent());
					}
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

book.xml结构

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>安徒生童话</name>
		<author>安徒生</author>
		<year>2016</year>
		<page>521</page>
	</book>
	
	<book id="2">
		<name>名侦探柯南</name>
		<author>青山刚昌</author>
		<year>1996</year>
		<page>5412</page>
	</book>
</bookstore>

输出结果

  • 一共有:2本书

  • 下面开始遍历第1本书的内容

  • 第1本书共有1个属性

  • 属性名:id,属性值:1

  • 第1本书有9个子节点

  • 节点名:name,节点值:安徒生童话

  • 节点名:author,节点值:安徒生

  • 节点名:year,节点值:2016

  • 节点名:page,节点值:521

  • 下面开始遍历第2本书的内容

  • 第2本书共有1个属性

  • 属性名:id,属性值:2

  • 第2本书有9个子节点

  • 节点名:name,节点值:名侦探柯南

  • 节点名:author,节点值:青山刚昌

  • 节点名:year,节点值:1996

  • 节点名:page,节点值:5412


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值