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解析相关推荐

  1. java dom4j 写xml文件_Java实现——Dom4j读写XML文件

    1. dom4j概述 解析DOM4J是一个开源XML解析包,采用了Java集合框架并完全支持DOM,SAX和JAXP. 最大的特色是使用了大量的接口,主要接口都在org.dom4j里定义. 2. do ...

  2. java dom读写xml文件_java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 encoding="GB2312"?> "男"> 李华姓名> 14年龄> 学生> ...

  3. sql java 解析_Java 实现对Sql语句解析

    最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数据,建立表关系外,对基本的sql查询语句要做一个解析,这样我们才能知道用户的查询要求:因为时间关系,参考了已有的一篇文章,并对其实现中出 ...

  4. java导出html word文档_java生成带html样式的word文件

    最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是使用Jacob或POI等组件直接生成Word,但是都无法将富文本编辑器处理过的文字保留样式并保存为Word, ...

  5. java html 字符串截取字符串长度_Java截取带html标签的字符串,再把标签补全(保证页面显示效果)...

    一般是用在字符串中有html标签的截取. 如: 后台发布用了在线编辑器, 前台显示内容要截取的情况. import Java.util.ArrayList; import java.util.List ...

  6. java 令牌解析_Java编程guava RateLimiter实例解析

    本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方 ...

  7. java常用代码解析_Java设计模式常用原则代码解析

    本篇文章小编给大家分享一下Java设计模式常用原则代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.单一职责原则每一个类负责一个职责(一个类只有 ...

  8. java sql语法解析_Java中的SQL语句解析

    String sql = "SELECT userId,password FROM Table_1 where userId ='" + userId +"' and p ...

  9. java 自带thread分析工具_java自带的jvm分析工具

    这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈. ...

最新文章

  1. Spring AOP的一些概念
  2. 如何通过VPC在本机搭建局域网
  3. 工程勘察设计管理条例释义电子书_全国有多少注册勘察设计工程师?官方数据告诉你...
  4. ZBar 自定义界面
  5. 机器学习资料整理,收藏了不后悔!
  6. HPU--1189 Ou à
  7. Excel: 如何对Excel2007工作表做统一编辑修改
  8. 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
  9. 【C 语言提高、进阶】Day 3
  10. 搭建 IPv6 Web服务器
  11. rc时间常数定义_时间常数RC的计算方法
  12. 微型计算机97 占有率,第1章++微型计算机基础.ppt
  13. springboot项目配置视图解析器无效的问题
  14. vb.net 教程 3-4 窗体编程 公共控件6 PictureBox ProgressBar
  15. 《 iOS-checkIPA 》ipa 文件信息检查工具
  16. 字节跳动校招内推开始了
  17. Java 面试题看这些就够了
  18. SkeyeRTSPLive传统视频监控互联网+实现利器解决方案
  19. 奔波霸儿大战邮箱服务器
  20. 如何在Windows上下载java

热门文章

  1. java在线作业系统_在线作业系统论文
  2. opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分
  3. Kobe Bryant crash report
  4. 现在有N元钱,两块钱一瓶,或者直接给你N瓶酒,两个空瓶换一瓶酒,四个瓶盖换一瓶酒,问你最后可以喝多少瓶?如果能借酒呢?
  5. win10 详细配置JAVA环境变量(最详细),操作步骤如下:
  6. 后端直接跳转前端页面_WEB前端开发中页面跳转等待时间过长如何解决?
  7. Windows环境安装Gradle6.4.1
  8. Logstash7.6.0同步MySQL到Elasticsearch
  9. mysql java 分页实体类_Java GUI+mysql+分页查询
  10. python 立体图像_OpenCV-Python 立体图像的深度图 | 五十二