读取XML的几种方式

一、为什么使用XML

1、便于不同应用程序之间通信。
2、便于不同平台之间通信。
3、便于不同平台之间数据共享。

二、Dom读取

xml文件内容

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book id="1"><name>冰与火之歌</name><author>乔治马丁</author><year>2014</year><price>89</price></book><book id="2"><name>安徒生童话</name><year>2004</year><price>77</price><language>English</language></book>
</bookstore>

dom代码

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.dom4j.Node;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;public class DomReadXml {public static void main(String[] args) {readXml();}public static void readXml() {try {// 创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();// 创建一个Document对象Document doc = db.parse("books.xml");NodeList bookList = doc.getElementsByTagName("book");// 获取节点个数System.out.println("一共有" + bookList.getLength() + "本书");// 遍历每个book节点for (int i = 0; i < bookList.getLength(); i++) {System.out.println("*******************************");// 索引从零开始org.w3c.dom.Node book = bookList.item(i);// 获取book节点所有属性集合org.w3c.dom.NamedNodeMap attrs = book.getAttributes();System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "属性");// 遍历book属性,不知道节点属性和属性名情况for (int j = 0; j < attrs.getLength(); j++) {// 获取某一个属性org.w3c.dom.Node attr = attrs.item(j);System.out.print("属性名:" + attr.getNodeName());System.out.println(" --- 属性值:" + attr.getNodeValue());}// 若已经知道book节点有且只有1个ID属性,可用以下方式// org.w3c.dom.Element e = (org.w3c.dom.Element)// bookList.item(i);// System.out.println("Element属性值:"+e.getAttribute("id"));NodeList childNodes = book.getChildNodes();for (int k = 0; k < childNodes.getLength(); k++) {// 区分,去掉空格和换行符if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {// 获取element类型的节点和节点值System.out.print("节点名:" + childNodes.item(k).getNodeName());System.out.print(" --- 节点值:" + childNodes.item(k).getFirstChild().getNodeValue());System.out.println(" --- 节点值:"+childNodes.item(k).getTextContent());}}}} catch (Exception e) {e.printStackTrace();}}
}

结果输出:
这里写图片描述

三、Dom4j读取

使用dom4j需要导入相关的jar包

import java.io.File;
import java.util.Iterator;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class Dom4jReadXml {public static void main(String[] args) {readXml();}public static void readXml(){try {// 创建SAXReader对象SAXReader reader = new SAXReader();// 加载xml文件Document dc= reader.read(new File("books.xml"));// 获取根节点Element e = dc.getRootElement();// 获取迭代器Iterator it = e.elementIterator();// 遍历迭代器,获取根节点信息while(it.hasNext()){Element book = (Element) it.next();List<Attribute>  atts= book.attributes();// 获取book属性名和属性值for (Attribute att : atts) {System.out.println("节点名:"+att.getName()+"节点值:"+att.getValue());					}Iterator itt = book.elementIterator();while(itt.hasNext()){Element b = (Element) itt.next();System.out.println("属性名:"+b.getName()+"属性值:"+b.getText());}}} catch (Exception e) {// TODO: handle exception}}}

结果输出:
这里写图片描述

四、JDom读取

使用jdom需要导入相关的jar包

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;public class JDomReadXml {public static void main(String[] args) {// readXml();}@SuppressWarnings("unchecked")public static void readXml(){List<Book> bList = new ArrayList<Book>();try {// 创建一个SAXBuilder对象SAXBuilder builder = new SAXBuilder();// 创建一个输入流InputStream in = new FileInputStream("books.xml");// 处理乱码情况InputStreamReader isr = new InputStreamReader(in, "UTF-8");// 通过build方法,将输入流加载到SAXBuilder中Document doc = builder.build(isr);// 通过Document对象获取根节点Element foo= doc.getRootElement();// 获取根节点下子节点名List<Element> allChildren = foo.getChildren();// 进行解析for (Element book : allChildren) {Book b = new Book();System.out.println("开始解析第"+(allChildren.indexOf(book)+1)+"本书");// 解析book属性集合List<Attribute> attrList = book.getAttributes();// 遍历(针对不清楚节点下属性名)for (Attribute attr : attrList) {System.out.println("属性名:"+attr.getName() +" -- 属性值:"+attr.getValue());if("id".equals(attr.getName())){b.setId(attr.getValue());}}// 清楚知道属性名获取属性值String v = book.getAttributeValue("id");System.out.println("清楚知道属性名"+v);// 对book节点子节点的节点名和节点值进行遍历List<Element> bookChiles = book.getChildren();for (Element element : bookChiles) {System.out.println("属性名:"+element.getName() +" -- 属性值:"+element.getValue());if("name".equals(element.getName())){b.setName(element.getValue());}else if("author".equals(element.getName())){b.setAuthor(element.getValue());}else if("year".equals(element.getName())){b.setYear(element.getValue());}else if("price".equals(element.getName())){b.setPrice(element.getValue());}else if("language".equals(element.getName())){b.setLanguage(element.getValue());}}System.out.println("结束解析第"+(allChildren.indexOf(book)+1)+"本书");bList.add(b);b = null;}} catch (Exception e) {e.printStackTrace();}}
}

结果输出:
这里写图片描述

五、Sax读取

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;public class SaxReadXml {public static void main(String[] args) {readXml();}public static void readXml() {try {// 创建工厂SAXParserFactory sf=SAXParserFactory.newInstance();// 获取SAXParser实例SAXParser sp = sf.newSAXParser();// 创建一个解析对象SAXParserHandler handler = new SAXParserHandler();sp.parse("books.xml", handler);for(Book book : handler.getbList()){System.out.println(book.getId());System.out.println(book.getName());System.out.println(book.getAuthor());System.out.println(book.getYear());System.out.println(book.getPrice());System.out.println(book.getLanguage());System.out.println("*****************");}} catch (Exception e) {e.printStackTrace();}}
}

SAXParserHandler .java

import java.util.ArrayList;
import java.util.List;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class SAXParserHandler extends DefaultHandler {int bookIndex = 0;String str = null;Book b = null;private List<Book> bList = new ArrayList<Book>();public List<Book> getbList() {return bList;}/*** 用来遍历xml文件的开始标签*/@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// 调用DefaultHandler的startElement方法super.startElement(uri, localName, qName, attributes);// 开始解析book元素属性if(qName.equals("book")){bookIndex++;// 创建一个book对象b = new Book();System.out.println("****开始第"+bookIndex+"本书内容****");// 已知book元素下属性名称,根据属性名称获取属性值sString value = attributes.getValue("id");System.out.println("book的属性值是:"+value);int num = attributes.getLength();for(int i=0;i<num;i++){System.out.print("book元素的第"+(i+1)+"个属性名是:"+attributes.getQName(i));System.out.println(" -- 属性值是:"+attributes.getValue(i));if(attributes.getQName(i).equals("id")){b.setId(attributes.getQName(i));}}}else if(!qName.equals("book") && !qName.equals("bookstore")){System.out.print("节点名是:"+qName);}}/*** 用来遍历xml文件的结束标签*/@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// 调用DefaultHandler的endElement方法super.endElement(uri, localName, qName);// 判断是否针对一本书已经遍历结束if(qName.equals("book")){bList.add(b);b = null;System.out.println("****结束第"+bookIndex+"本书内容****");}else if(qName.equals("name")){b.setName(str);}else if(qName.equals("author")){b.setAuthor(str);}else if(qName.equals("year")){b.setYear(str);}else if(qName.equals("price")){b.setPrice(str);}else if(qName.equals("language")){b.setLanguage(str);}}/*** 用来标志解析开始*/@Overridepublic void startDocument() throws SAXException {// 调用DefaultHandler的startDocument方法super.startDocument();System.out.println("解析开始");}/*** 用来标志解析结束*/@Overridepublic void endDocument() throws SAXException {// 调用DefaultHandler的endDocument方法super.endDocument();System.out.println("解析结束");}/*** 用来标志解析结束*/@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// 调用DefaultHandler的characters方法 super.characters(ch, start, length);str = new String(ch, start, length);if(!str.trim().equals("")){System.out.println(" -- 节点值是:"+str);}		}}

结果输出:
这里写图片描述

六、附赠properties的读取

在src文件中新建文件dataBase.properties
在文件中写入projectName=\u6D4B\u8BD5\u9879\u76EE

public class ReadProperties {public static void main(String[] args){System.out.println(getProjectName());}public static String getProjectName() {Properties pro = new Properties();try {// 获取文件内容InputStream cp = ReadProperties.class.getResourceAsStream("/dataBase.properties");// 加载pro.load(cp);// 获取projectName属性return pro.getProperty("projectName");} catch (Exception e) {e.printStackTrace();return "出错了";}}
}

结果输出:测试项目

七、总结

 * dom平台无关,官方解析方式,一次性加载,方便解析,代码容易编写,当文件过大,容易造成内存溢出* sax基于事件驱动的解析方式,加载时进行验证判断,内存耗费小,不易编码,很难同时访问一个xml中的多处不同数据* * jdom和dom4j是基于sax扩展* * jdom仅使用具体类而不使用接口,api中大量使用了collections类* * dom4j是jdom的一种智能分支,具有性能优异,灵活性好,功能强大和易使用的特点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109379.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《JDK17新特性和代码案例演示》

《JDK17新特性和代码案例演示》 &#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全…

mysql 日志总结

mysql 根据日志的功能&#xff0c;分6种 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time 的所有查询&#xff0c;方便我们对查询进行优化通用查询日志&#xff1a;记录所有连接的起始时间和终止时间&#xff0c;以及连接发送给数据库服务器的所有指令&#xff0…

GcExcel:Java 应用创建、修改和保存 Excel 电子表格 -Crack

在 Java 应用程序中创建、修改和保存 Excel 电子表格&#xff1a; GrapeCity Documents for Excel&#xff0c;Java 版 (GcExcel) 是一个高速 Java Excel 电子表格 API 库&#xff0c;不需要依赖于 Microsoft Excel。用户可以通过 Java 应用程序以编程方式创建、编辑、导入和导…

供应商整合对企业有哪些好处?

企业采购总是希望降低成本&#xff0c;赢得更多的利润。实现这目标的其中一种方法就是供应商整合。 究竟什么是供应商整合&#xff1f;整合供应商有哪些好处&#xff1f;本文为你详细解答。 什么是供应商整合&#xff1f; 供应商整合是减少特定产品或服务的供应商数量的过程。…

Pdf文件签名检查

如何检查pdf的签名 首先这里有一个已经签名的pdf文件&#xff0c;通过pdf软件可以看到文件的数字签名。 下面就是如何代码检查这里pdf文件的签名 1.引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId&g…

20230915-DBeaver 23.2.0 版本提取mybatis注解版内容未开启

1、21.2.1版本的是可以的直接提取sql的&#xff0c;例如 复制mybatis 注解版中的script中的内容到dbeaver的编辑器中会自动帮我们将多余的符号去除 Select("<script>" "SELECT * FROM book a1\r\n" "WHERE DATE_FORMAT(a1.date, %Y-%m-%d) #…

第31章_瑞萨MCU零基础入门系列教程之WIFI蓝牙模块驱动实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

芯片设计流程

VLSI 代表超大规模集成&#xff08;Very Large Scale Integration&#xff09;&#xff0c;这是一种通过将数百万个晶体管集成到单个芯片中来创建集成电路 (IC) 的技术。超大规模集成电路技术可以生产出紧凑、功能强大且低成本的微处理器、存储芯片、数字信号处理器和其他先进电…

人脸识别三部曲

人脸识别三部曲 首先看目录结构图像信息采集 采集图片.py模型训练 训练模型.py人脸识别 人脸识别.py效果 首先看目录结构 引用文121本 opencv │ 采集图片.py │ 训练模型.py │ 人脸识别.py │ └───trainer │ │ trainer.yml │ └───data │ └──…

React总结1

3 React技术 React是Facebook于2013年开源的框架。React解决的是前端MVC框架中的View视图层的问题。 3.1 Virtual DOM* DOM&#xff08;文档对象模型Document Object Model&#xff09; 将网页内所有内容映射到一棵树型结构的层级对象模型上&#xff0c;浏览器提供对DOM的支…

62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务

这节的要点&#xff1a; 就是弄两个项目 &#xff0c; 从 端口9090 这个项目&#xff0c;通过 restTemplate&#xff0c; 去访问 端口8080 的项目&#xff0c;并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…

Linux基本认识

一、Linux基本概念 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多…