JAVA进阶-解析xml文件-jaxp解析器

XML简介
jaxp解析XML
dom4j解析XML

 
 

xml的解析简介

xml的解析方式(技术):dom 和 sax

dom解析和sax解析区别:

  • dom方式解析

    • 根据xml的层级结构在内存中分配一个树形结构,
    • 把xml的标签,属性和文本都封装成对象
    • 缺点:如果文件过大,造成内存溢出
    • 优点:很方便实现增删改操作
       
  • sax方式解析

    • 采用事件驱动,边读边解析
    • 从上到下,一行一行的解析,解析到某一个对象,返回对象名称
    • 缺点:不能实现增删改操作
    • 优点:如果文件过大,不会造成内存溢出,方便实现查询操作

想要解析xml,首先需要解析器
不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供

  • sun公司提供了针对dom和sax解析器 jaxp
  • dom4j组织,针对dom和sax解析器 dom4j (最多使用)
  • jdom组织,针对dom和sax解析器 jdom (基本没人用)

jaxp解析器

jaxp是javase的一部分, jaxp解析器在jdk的javax.xml.parsers包里面

四个类:分别是针对dom和sax解析使用的类

dom: DocumentBuilder、DocumentBuilderFactory
sax:  SAXParser  、 SAXParserFactory

 
 

DOM


*** dom: DocumentBuilder、DocumentBuilderFactory

DocumentBuilder  : dom解析器类
	- 这个类是一个抽象类,不能new,
	 此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取

	- 一个方法,可以解析xml  parse("xml路径") 返回是 Document 整个文档
	- 返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
	
			
DocumentBuilderFactory: dom 解析器工厂
		- 这个类也是一个抽象类,不能new
		newInstance() 获取 DocumentBuilderFactory 的实例。





dom操作步骤
	 1、创建解析器工厂
		DocumentBuilderFactory.newInstance();
	 2、根据解析器工厂创建解析器
		builderFactory.newDocumentBuilder();
	 3、解析xml返回document
	 	Document document = builder.parse("src/person.xml");
	 4、根据document的方法进行其他操作





--------- 在document里面方法 ---------

		getElementsByTagName(String tagname) 
		-- 这个方法可以得到标签
		-- 返回集合 NodeList

		createElement(String tagName)
		-- 创建标签

		createTextNode(String data) 
		-- 创建文本

		appendChild(Node newChild) 
		-- 把文本添加到标签下面

		removeChild(Node oldChild) 
		-- 删除节点

		getParentNode() 
		-- 获取父节点



		NodeList list
			- getLength() 得到集合的长度
			- item(int index)下标取到具体的值

			for(int i=0;i<list.getLength();i++) {
				list.item(i)
			}

			getTextContent()
			- 得到标签里面的内容

 
 

dom查询

在这里插入图片描述
 
 

dom添加节点

在这里插入图片描述 
 

dom修改节点

在这里插入图片描述 
 

dom删除节点

在这里插入图片描述
 
 

dom遍历节点的所有子节点

在这里插入图片描述

	//遍历并缩进输出一个xml结点的所有子节点:
	
	public static void printDocument(Node node) {
		int n = 0;
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
		NodeList list = node.getChildNodes();
		n++;
		for (int i = 0; i < list.getLength(); i++) {
			printDocument(list.item(i),n);
		}
	}
	
	public static void printDocument(Node node,int n) {
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			for (int i = 0; i < n; i++) {
				System.out.print(" ");
			}
			System.out.println(node.getNodeName());
		}
		NodeList list = node.getChildNodes();
		n++;
		for (int i = 0; i < list.getLength(); i++) {
			printDocument(list.item(i),n);
		}
	}

在这里插入图片描述

SAX

*** sax:SAXParser、SAXParserFactory

SAXParser:sax解析器类
			此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
			- parse(File f, DefaultHandler dh) 
				* 两个参数
				** 第一个参数:xml的路径
				** 事件处理器


SAXParserFactory: 解析器工厂
					实例 newInstance() 方法得到

sax执行过程

		* 当解析到开始标签时候,自动执行startElement方法

		* 当解析到文本时候,自动执行characters方法

		* 当解析到结束标签时候,自动执行endElement方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值