java自带的xml解析_Java自带的XML解析
JAXP(Java API for XML Processing,意为处理XML的Java API)
解析XML一般有两种方式:
一种是DOM方式:一次性读取XML内容存入内存
优点:能进行各种增删改查的操作
确定:占用内存大
使用:给定需要读取的文件即可读取,读取出来之后再根据自己写的方法进行操作
还有一种是SAX方式:顺序读取内容,碰到什么样的标签执行什么样的操作由自己定义
优点:占用内存小
缺点:不能进行各种增删改查操作,只能遍历出内容
使用:给定需要读取的文件和一个操作集,操作集会指示在遍历的时候遇到什么冻死做什么事
对xml进行操作就是操作xml文件当中的元素和属性:文本内容>
由于元素里面的文本内容可以是子元素,而为了阅读方便通常都是换行另起一行并缩进的,造成了父元素和子元素之间有两段空格和一个换行,解析xml文档的时候识别不了,所以也会一并读取出来
举例:
XML文件:students.xml
tom
20
male
jerry
19
female
DOM方式实现类:DomDemo.java
package com.jyh.xml.parser;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomDemo {
public static void main(String[] args) {
//1.获取jaxp工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//2.获取解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.用解析器加载xml文档--->Document
Document document = builder.parse(new File("src/students.xml"));
//4.获得所有学生集合
NodeList studentList = document.getElementsByTagName("student");
//5.遍历学生集合
for(int i = 0; i < studentList.getLength(); i ++){
//通过下标获得各个学生
Element stuElm = (Element)studentList.item(i);
//获取每个学生的学号属性
String number = stuElm.getAttribute("number");
System.out.println("学号:" + number);
//获取每个学生下的所有子节点(包括空白)
NodeList childrenList = stuElm.getChildNodes();
//便利子节点集合获取元素
int length = childrenList.getLength();
for(int j = 0; j < length; j ++){
Node node = childrenList.item(j);
//判断子节点是不是element元素类型(因为遍历过程中会遍历出空格和换行)
if(node.getNodeType() == Node.ELEMENT_NODE){
Element child = (Element) node;
switch (child.getNodeName()) {
case "name":
String name = child.getTextContent();
System.out.println("姓名:" + name);
break;
case "age":
String age = child.getTextContent();
System.out.println("年龄:" + age);
break;
case "sex":
String sex = child.getTextContent();
System.out.println("性别:" + sex);
break;
default:
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种方式就是对树进行操作,开始根据根元素名获取根元素集合:
NodeList studentList = document.getElementsByTagName("student");
然后遍历根集合获得每个根元素,由于有了根元素,所以可以根据根节点获取下面的子元素:
NodeList childrenList = stuElm.getChildNodes();
获得属性就用方法
String number = stuElm.getAttribute("number");
输出结果:
学号:jyh_0001
姓名:tom
年龄:20
性别:male
学号:jyh_0002
姓名:jerry
年龄:19
性别:female
SAX方式实现类:SaxDemo.java和MyHandle.java
SaxDemo.java:
package com.jyh.xml.parser;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxDemo {
public static void main(String[] args) {
//1.获得解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.获得解析器
try {
SAXParser parser = factory.newSAXParser();
//3.解析文档(告诉去读取哪个文档,读取文档过程中遇到什么情况该怎么处理)
//第一个参数代表要解析的文档,第二个参数代表解析文档过程中遇到什么样的情况该怎么做
parser.parse(new File("src/students.xml"), new MyHandle());
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyHandle.java:
package com.jyh.xml.parser;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandle extends DefaultHandler{
//文档开始解析
@Override
public void startDocument() throws org.xml.sax.SAXException {
System.out.println("文档开始解析");
}
/*遇到元素开始解析
* 参数3是读取到的元素名称,参数4是读取到的元素的属性集
*/
@Override
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws org.xml.sax.SAXException {
System.out.println(qName + "元素开始解析");
//判断遇到的是不是学生元素
if(qName.equals("student")){
//如果是则获取该元素的属性
String number = attributes.getValue("number");
System.out.println("学号:" + number);
}
}
//遇到文本开始解析
@Override
public void characters(char[] ch, int start, int length)
throws org.xml.sax.SAXException {
String str = new String(ch,start,length);
str = str.trim();
if(str.length() > 0){
System.out.println(str);
}
}
//元素解析结束
@Override
public void endElement(String uri, String localName, String qName)
throws org.xml.sax.SAXException {
System.out.println(qName + "元素解析结束");
}
//文档结束触发
@Override
public void endDocument() throws org.xml.sax.SAXException {
System.out.println("文档解析结束");
}
}
MyHandle里有五个方法:
startDocument();-->开始解析文档
startElement(String uri, String localName, String qName,org.xml.sax.Attributes attributes);-->碰到元素开始符则开始解析元素
String number = attributes.getValue("number");-->获取元素的属性
characters(char[] ch, int start, int length);-->碰到文本开始解析文本
endElement();-->碰到元素结束符,结束元素解析
endDocument(String uri, String localName, String qName);-->结束解析文档
输出结果(优化之后):
文档开始解析
students元素开始解析
student元素开始解析
学号:jyh_0001
name元素开始解析
tom
name元素解析结束
age元素开始解析
20
age元素解析结束
sex元素开始解析
male
sex元素解析结束
student元素解析结束
student元素开始解析
学号:jyh_0002
name元素开始解析
jerry
name元素解析结束
age元素开始解析
19
age元素解析结束
sex元素开始解析
female
sex元素解析结束
student元素解析结束
students元素解析结束
文档解析结束
java自带的xml解析_Java自带的XML解析相关推荐
- java dom4j 写xml文件_Java实现——Dom4j读写XML文件
1. dom4j概述 解析DOM4J是一个开源XML解析包,采用了Java集合框架并完全支持DOM,SAX和JAXP. 最大的特色是使用了大量的接口,主要接口都在org.dom4j里定义. 2. do ...
- java dom读写xml文件_java通过dom读写xml文件
java通过dom读写xml文件 要读的xml文件 encoding="GB2312"?> "男"> 李华姓名> 14年龄> 学生> ...
- sql java 解析_Java 实现对Sql语句解析
最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数据,建立表关系外,对基本的sql查询语句要做一个解析,这样我们才能知道用户的查询要求:因为时间关系,参考了已有的一篇文章,并对其实现中出 ...
- java导出html word文档_java生成带html样式的word文件
最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是使用Jacob或POI等组件直接生成Word,但是都无法将富文本编辑器处理过的文字保留样式并保存为Word, ...
- java html 字符串截取字符串长度_Java截取带html标签的字符串,再把标签补全(保证页面显示效果)...
一般是用在字符串中有html标签的截取. 如: 后台发布用了在线编辑器, 前台显示内容要截取的情况. import Java.util.ArrayList; import java.util.List ...
- java 令牌解析_Java编程guava RateLimiter实例解析
本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方 ...
- java常用代码解析_Java设计模式常用原则代码解析
本篇文章小编给大家分享一下Java设计模式常用原则代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.单一职责原则每一个类负责一个职责(一个类只有 ...
- java sql语法解析_Java中的SQL语句解析
String sql = "SELECT userId,password FROM Table_1 where userId ='" + userId +"' and p ...
- java 自带thread分析工具_java自带的jvm分析工具
这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈. ...
最新文章
- Spring AOP的一些概念
- 如何通过VPC在本机搭建局域网
- 工程勘察设计管理条例释义电子书_全国有多少注册勘察设计工程师?官方数据告诉你...
- ZBar 自定义界面
- 机器学习资料整理,收藏了不后悔!
- HPU--1189 Ou à
- Excel: 如何对Excel2007工作表做统一编辑修改
- 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
- 【C 语言提高、进阶】Day 3
- 搭建 IPv6 Web服务器
- rc时间常数定义_时间常数RC的计算方法
- 微型计算机97 占有率,第1章++微型计算机基础.ppt
- springboot项目配置视图解析器无效的问题
- vb.net 教程 3-4 窗体编程 公共控件6 PictureBox ProgressBar
- 《 iOS-checkIPA 》ipa 文件信息检查工具
- 字节跳动校招内推开始了
- Java 面试题看这些就够了
- SkeyeRTSPLive传统视频监控互联网+实现利器解决方案
- 奔波霸儿大战邮箱服务器
- 如何在Windows上下载java
热门文章
- java在线作业系统_在线作业系统论文
- opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分
- Kobe Bryant crash report
- 现在有N元钱,两块钱一瓶,或者直接给你N瓶酒,两个空瓶换一瓶酒,四个瓶盖换一瓶酒,问你最后可以喝多少瓶?如果能借酒呢?
- win10 详细配置JAVA环境变量(最详细),操作步骤如下:
- 后端直接跳转前端页面_WEB前端开发中页面跳转等待时间过长如何解决?
- Windows环境安装Gradle6.4.1
- Logstash7.6.0同步MySQL到Elasticsearch
- mysql java 分页实体类_Java GUI+mysql+分页查询
- python 立体图像_OpenCV-Python 立体图像的深度图 | 五十二