使用java解析xml文档

一、java解析xml文档
1、了解使用w3c组织提供的java组件解析xml文件
2、*掌握使用开源组织的Dom4j解析xml文档
3、*掌握使用dom4解析xml文档过程
4、*使用dom4j组件对xml文档进行管理

二、使用w3c提供的组件解析xml文件
1、常用的解析文档的步骤
(1)创建文档构建工厂

DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();

(2)使用文档构建工厂获取xml的文档构建对象

DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();

(3)使用构建对象加载xml文件,并获取W3c的Document(文档)对象

Document document=documentBuilder.parse(file);

(4)使用Document对象获取节点列表对象NodeList,使用元素名称进行获取

NodeList sid_nodeList=document.getElementsByTagName("sid");
NodeList sname_nodeList=document.getElementsByTagName("sname");
NodeList sex_nodeList=document.getElementsByTagName("sex");
NodeList address_nodeList=document.getElementsByTagName("address");
NodeList sdate_nodeList=document.getElementsByTagName("sdate");
NodeList classname_nodeList=document.getElementsByTagName("className");

在这里插入图片描述(5)使用NodeList对象获取xml文档中的元素对象并获取其中的文本内容

//获取sid元素的节点列表
			NodeList sid_nodeList=document.getElementsByTagName("sid");
			NodeList sname_nodeList=document.getElementsByTagName("sname");
			NodeList sex_nodeList=document.getElementsByTagName("sex");
			NodeList address_nodeList=document.getElementsByTagName("address");
			NodeList sdate_nodeList=document.getElementsByTagName("sdate");
			NodeList classname_nodeList=document.getElementsByTagName("className");
			System.out.println("sid元素的个数:"+sid_nodeList.getLength());
			
			//获取sid元素的文本内容
			for (int i = 0; i < sid_nodeList.getLength(); i++) {
				Node sidNode=sid_nodeList.item(i);
				Node snameNode=sname_nodeList.item(i);
				Node sexNode=sex_nodeList.item(i);
				Node addressNode=address_nodeList.item(i);
				Node sdateNode=sdate_nodeList.item(i);
				Node classnameNode=classname_nodeList.item(i);
				
				//获取sid节点的文本内容
				String sid=sidNode.getTextContent();
				String sname=snameNode.getTextContent();
				String sex=sexNode.getTextContent();
				String address=addressNode.getTextContent();
				String sdate=sdateNode.getTextContent();
				String classname=classnameNode.getTextContent();
				
				System.out.println("编号:"+sid);
				System.out.println("姓名:"+sname);
				System.out.println("性别:"+sex);
				System.out.println("地址:"+address);
				System.out.println("生日:"+sdate);
				System.out.println("班级:"+classname);
				System.out.println("==========================");
			}

完整的解析代码示例:
(1)student.xml结构

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student>
		<sid>1</sid>
		<sname>张飞</sname>
		<sex></sex>
		<address>北京</address>
		<sdate>1998-12-21</sdate>
		<className>java1班</className>
	</student>
	<student>
		<sid>2</sid>
		<sname>赵云</sname>
		<sex></sex>
		<address>常山</address>
		<sdate>1999-11-21</sdate>
		<className>java2班</className>
	</student>
	<student>
		<sid>3</sid>
		<sname>关羽</sname>
		<sex></sex>
		<address>运城</address>
		<sdate>1997-10-21</sdate>
		<className>java1班</className>
	</student>
	<student>
		<sid>4</sid>
		<sname>马超</sname>
		<sex></sex>
		<address>汉中</address>
		<sdate>1998-12-21</sdate>
		<className>java1班</className>
	</student>
	<student>
		<sid>5</sid>
		<sname>黄忠</sname>
		<sex></sex>
		<address>长沙</address>
		<sdate>1998-12-21</sdate>
		<className>java1班</className>
	</student>
	
</students>

(2)W3c解析的步骤和过程:

package com.test;
import java.util.*;
import java.io.*;

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XmlDemo1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//创建文件对象指定要操作的xml文件的路径
		File file=new File("student.xml");
		
		//创建文档构建工厂对象
		DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
		
		try {
			//通过文档工厂构建对象获取文档构建对象
			DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
			
			//使用文档构建对象加载xml文件对象,获取文档对象
			Document document=documentBuilder.parse(file);
			
			
			//获取sid元素的节点列表
			NodeList sid_nodeList=document.getElementsByTagName("sid");
			NodeList sname_nodeList=document.getElementsByTagName("sname");
			NodeList sex_nodeList=document.getElementsByTagName("sex");
			NodeList address_nodeList=document.getElementsByTagName("address");
			NodeList sdate_nodeList=document.getElementsByTagName("sdate");
			NodeList classname_nodeList=document.getElementsByTagName("className");
			System.out.println("sid元素的个数:"+sid_nodeList.getLength());
			
			//获取sid元素的文本内容
			for (int i = 0; i < sid_nodeList.getLength(); i++) {
				Node sidNode=sid_nodeList.item(i);
				Node snameNode=sname_nodeList.item(i);
				Node sexNode=sex_nodeList.item(i);
				Node addressNode=address_nodeList.item(i);
				Node sdateNode=sdate_nodeList.item(i);
				Node classnameNode=classname_nodeList.item(i);
				
				//获取sid节点的文本内容
				String sid=sidNode.getTextContent();
				String sname=snameNode.getTextContent();
				String sex=sexNode.getTextContent();
				String address=addressNode.getTextContent();
				String sdate=sdateNode.getTextContent();
				String classname=classnameNode.getTextContent();
				
				System.out.println("编号:"+sid);
				System.out.println("姓名:"+sname);
				System.out.println("性别:"+sex);
				System.out.println("地址:"+address);
				System.out.println("生日:"+sdate);
				System.out.println("班级:"+classname);
				System.out.println("==========================");
			}
			
		} 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();
		}			
	}

}

三、xml文档的解析类型
1、DOM(Document Object Model)解析
需要将整个xml文档加载到内存中,在内存中形成倒挂的文档树。从根节点逐次向子节点进行查询遍历的方式。此解析方式比较耗费内存,尤其是文档内容比较多的时候。

2、SAX解析
不需要将整个xml文档加载到内存,通过文档对象的节点事件方法,可以做到,解析到哪里就在哪里停止。内存的消耗比较低,但是不利于文档元素的增删改操作,查询效率很高。

四、使用第三方组件Dom4j解析xml文档
1、在当前工程引入dom4j.jar组件,并加入到构建路径
在这里插入图片描述在当前工程的根目录建立文件夹libs
在这里插入图片描述在这里插入图片描述点finish结束
在这里插入图片描述在这里插入图片描述

复制到libs下
在这里插入图片描述

选中libs下的两个jar文件点击右键,选择如下图所示,加入到构建路径
在这里插入图片描述在这里插入图片描述

完成以上操作后,dom4j的组件就加入到了当前工程中。可在代码中调用dom4j.jar的类文件。
2、使用dom4j的组件解析xml文档的步骤
(1)获取Dom4j的SaxReader对象.
SAXReader saxReader=new SAXReader();

(2)使用SaxReader对象加载xml文件对象,并获取dom4j的Document对象
Document document=saxReader.read(file);

(3)使用Document对象获取根元素对象
Element rootElement=document.getRootElement();

(4)根据跟元素对象获取子元素的集合对象List
List listStudentElement=rootElement.elements(“student”);
3、解析示例:

package com.test;
import java.util.*;
import java.io.*;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.*;
public class Dom4jDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//创建文件对象,指定要操作的XML文档路径
		File file=new File("student.xml");
		
		//创建SaxReader对象
		SAXReader saxReader=new SAXReader();
		
		try {
			//使用saxReader对象加载xml文件对象,并获取dom4j的Document对象
			Document document=saxReader.read(file);
			
			//获取根元素对象
			Element rootElement=document.getRootElement();
			
			
			//使用跟元素对象获取子元素的集合
			List<Element> listStudentElement=rootElement.elements("student");
			
			System.out.println("student元素的个数:"+listStudentElement.size());
			
			//通过学生元素节点,获取每个学生元素下的子元素节点的文本内容
			for (Element stuelement : listStudentElement) {
				String sid=stuelement.elementText("sid");//获取sid元素的内容
				String sname=stuelement.elementText("sname");//获取sname元素的内容
				String sex=stuelement.elementText("sex");//获取sex元素的内容
				String address=stuelement.elementText("address");//获取address元素的内容
				String sdate=stuelement.elementText("sdate");//获取sdate元素的内容
				String classname=stuelement.elementText("className");//获取classname元素的内容
		
				System.out.println("编号:"+sid);
				System.out.println("姓名:"+sname);
				System.out.println("性别:"+sex);
				System.out.println("地址:"+address);
				System.out.println("生日:"+sdate);
				System.out.println("班级:"+classname);
				System.out.println("============================");
			}
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值