读取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.mzph.cn/news/76407.shtml

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

相关文章

python main 函数-启动-传递参数 python 打包 exe C# 进程传参

Part1:Python main 传递参数 在Python编程中&#xff0c;我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数&#xff0c;即通过main函数传参 1.python main 函数-启动-传递参数 test.py import sysdef main():# 获取命令行参…

C盘清理教程

C盘清理教程 首先使用space Sniffer 扫一下c盘&#xff0c;然后看一下到底是哪个文件这么大 第二步&#xff0c;创建软链接。 首先将我们需要移动的文件的当前路径拷贝下来&#xff1a;C:\Users\Tom\Desktop\test-link\abc\ghi.txt 然后假设剪切到D盘下&#xff1a;D:\ghi.…

基于改进人工蜂群算法的 K 均值聚类算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

RBTree模拟实现

一、概念 概念&#xff1a;红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&a…

pdf拆分成多个文件的方法以及注意事项

PDF是一种非常流行的文件格式&#xff0c;但有时候我们需要将一个大的PDF文件拆分成多个小的文件&#xff0c;以便于管理和分享。本文将介绍一些拆分PDF文件的方法以及需要注意的事项。 AdobeAcrobat是一款专业的PDF编辑软件&#xff0c;可以轻松地拆分PDF文件。以下是使用Adob…

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…

【2023研电赛】兆易创新命题三等奖: 低成本单母线电流永磁同步无感驱动器

本文为2023年第十八届中国研究生电子设计竞赛兆易创新企业命题三等奖以及决赛最佳论文奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有…

通过阿贝云免费云服务器部署vue3+vite项目

通过阿贝云免费云服务器部署vue3vite项目 阿贝云&#xff1a;https://www.abeiyun.com 首先访问阿贝云登录后申请服务器&#xff0c;需要关注微信公众号绑定 然后我们给服务器安装操作系统&#xff0c;这里我使用了centos7.6 这里我使用finalshell 连接服务器 我们首先配置ng…

EPICS电机支持(asynMotor)

EPICS电机支持 1&#xff09; 顶层对象是EPICS motor记录 已经对这个对象编写了很多代码&#xff1a;spec&#xff0c;IDL和Python类等 2&#xff09;下一层是EPICS设备支持 了解motor记录&#xff0c;与驱动会话 3&#xff09;最底层是EPICS驱动 对motor记录一无所知&am…

如何提取视频中的音频?几个步骤轻松提取

在现今社交媒体的风靡下&#xff0c;许多人都会使用手机录制视频来记录生活中的美好瞬间。有时候&#xff0c;我们也会想要提取视频中的音频&#xff0c;例如将自己的演讲录音分发给听众。本文将会介绍如何在手机上提取视频中的音频以及需要注意的事项。 使用应用程序 首先&am…

Linux命令200例:write用于向特定用户或特定终端发送信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

Android高德地图截屏功能(可包含自定义控件)

一、不包含自定义控件 地图 SDK 支持对当前屏幕显示区域进行截屏&#xff0c;可以对地图、覆盖物&#xff08;包含信息窗口&#xff09;、Logo进行截取屏幕&#xff0c;这其中不包括地图控件、Toast窗口。 详细示例如下&#xff1a; // 对地图进行截屏aMap!!.getMapScreenSho…

正交试验设计法

正交实验设计 一、什么是正交试验设计法&#xff1f; 是一种成对测试交互的系统的统计方法。它提供了一种能对所有变量对的组合进行典型覆盖&#xff08;均匀分布&#xff09;的方法。 可以从大量的试验点中挑出适量的、有代表性的点&#xff0c;利用“正交表”&#xff0c;…

Python之数据库(MYSQL)连接

一&#xff09;数据库SQL语言基础 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database…

PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

全文下载链接:http://tecdat.cn/?p29480 作者&#xff1a;Xingsheng Yang 1 利用 python 爬取链家网公开的租房数据&#xff1b; 2 对租房信息进行分析&#xff0c;主要对房租相关特征进行分析&#xff0c;并搭建模型用于预测房租&#xff08;点击文末“阅读原文”获取完整代码…

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(下)

前言 在上一篇我们主要介绍了有关计算机网络概述的内容&#xff0c;下面这一篇我们将来介绍有关计算机网络体系结构与参考模型的内容。这一篇博客紧紧联系上一篇博客。 这一篇博客主要内容是&#xff1a;计算机网络体系结构与参考模型&#xff0c;主要是计算机网络分层结构、协…

Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项

在过去的一年里&#xff0c;我发现苹果系统中的“文字搜图片”功能非常好用&#xff0c;这个功能不光 iPhone/iPad&#xff0c;Mac 也有&#xff0c;找一些图片真的很好用。但是遇到了一个问题&#xff1a;这个功能需要一段时间才能找到新的图片&#xff0c;而且没法手动刷新&a…

STM32-HAL库07-软件SPI驱动0.96寸OLED

STM32-HAL库07-软件SPI驱动0.96寸OLED 一、所用材料&#xff1a; STM32VGT6自制控制板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 二、所学内容&#xff1a; 通过HAL库配置四个GPIO输出口&#xff0c;对其进行软件模拟SPI发送规则&#xff0c;进而驱动OLED进行数…

火山引擎边缘云助力智能科技赋予生活更多新意

当下&#xff0c;先进的科学技术使得我们的日常生活变得快捷、舒适。大到上百层智能大厦、高端公共场所、社会智能基础设施&#xff0c;小到智能家居监控、指纹密码锁等&#xff0c;在这个充满想象力的时代&#xff0c;科技以更加智能化的方式改变和守护我们的生活。 引入智能…

IO和进程day05(进程与线程)

今日任务 1.代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/wait.h> #include <pthread.h>…