读取XML的几种方式

news2025/1/11 2:38:16

一、为什么使用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文件的开始标签
	 */
	@Override
	public 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元素下属性名称,根据属性名称获取属性值s
			String 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文件的结束标签
	 */
	@Override
	public 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);
		}
	}
	
	/**
	 * 用来标志解析开始
	 */
	@Override
	public void startDocument() throws SAXException {
		// 调用DefaultHandler的startDocument方法
		super.startDocument();
		System.out.println("解析开始");
	}
	
	/**
	 * 用来标志解析结束
	 */
	@Override
	public void endDocument() throws SAXException {
		// 调用DefaultHandler的endDocument方法
		super.endDocument();
		System.out.println("解析结束");
	}
	
	/**
	 * 用来标志解析结束
	 */
	@Override
	public 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.coloradmin.cn/o/1002734.html

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

相关文章

Java | 线程的生命周期和安全

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; &#x1f334;线程的生命周期 sleep方法会让线程睡眠&#xff0c;睡眠时间到了之后&#xff0c;立马就会执行下面的代码吗&#xff1f; 答&#xff1a;不会&am…

OSM最新电力数据(2023年9月1日数据)转换总结及与三个月前转换结果对比

sm包含种类繁多&#xff0c;我们这里是只以刚转换的电力设备为例抛砖引玉的进行说明。 首先先看一下转换结果大概368个文件&#xff0c;大约92种类型。当然其中有同一类设备的点、线、面类型&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)

AppStorage&#xff1a;应用全局的UI状态存储 AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和LocalStorage不同的是&#xff0c;LocalStorage是页面级的&…

SG-Former实战:使用SG-Former实现图像分类任务(一)

摘要 SG-Former是一种新型的Transformer模型&#xff0c;它被提出以降低视觉Transformer的计算成本&#xff0c;同时保持其优秀的性能表现。计算成本的降低使得SG-Former能够更有效地处理大规模的特征映射&#xff0c;从而提高了模型的效率和全局感知能力。 SG-Former的核心思…

算法综合篇专题三:二分法

"寻一颗&#xff0c;未萌的渺小啊&#xff0c;随着青翠未来&#xff0c;升入辽阔云霄~" 现在你有一个"升序"数组&#xff0c;想让你在这个数组里完成查找数字n&#xff0c;在这个数组内的下标&#xff0c;你可以怎么做&#xff1f;这也许是不少友子们初遇…

内存卡中毒了格式化能解决吗?这样清除病毒更有效

内存卡被广泛应用于手机、相机、MP3等数码产品&#xff0c;并且可以存储各种媒体文件&#xff0c;如视频、图片等。然而&#xff0c;在我们使用过程中&#xff0c;您是否因内存卡格式化而导致重要数据丢失感到困扰。对于“内存卡中毒了格式化能解决吗&#xff1f;“的疑惑&…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

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

【LeetCode刷题篇零】一些基础算法知识和前置技能(下)

数组常用技巧 使用数组代替Map 使用另一个数组来统计每个数字出现的次数&#xff0c;数组的下标作为key, 数组的值作为value&#xff0c; 将数字作为数组的下标索引&#xff0c;数组里的值存储该数字出现的次数&#xff0c;原理有点类似桶排序中使用的计数数组。 比如这里如…

tensorboard可视化文件:events.out.tfevents.

跑了一个开源代码&#xff0c;跑完之后看到生成的文件夹里&#xff0c;出现了events.out.thevents.xxx的格式文件&#xff0c;比较好奇&#xff0c;进行了一番学习~   首先说明文件作用&#xff1a;用于tensorboard显示的可视化文件 使用方法 首先要安装tensorboard&#x…

mvn打包:依赖包和启动包分离

简述 依赖插件&#xff1a; maven-jar-plugin maven-assembly-plugin项目目录结构 assembly.xml <assembly xmlns"http://maven.apache.org/ASSEMBLY/2.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

zookeeper可视化界面zkui

获取zkui github地址&#xff1a;https://github.com/DeemOpen/zkui 可以使用客户端clone&#xff0c;我这里直接下载zip 解压 编译 如果将包下载到了linux&#xff0c;需要在linux中编译&#xff0c;我的linux没有maven&#xff0c;所以在window编译好&#xff0c;然后复制…

Win10显卡驱动安装失败怎么办

在更新Win10系统的过程中&#xff0c;显卡驱动也要跟着更新&#xff0c;近期有小伙伴反映在安装的过程中显示Win10显卡驱动安装失败&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10显卡驱动安装失败的解决方法&…

一文说清mmap内存映射底层原理(以LCD中的Framebuffer为例)

一文说清mmap内存映射底层原理 【目录】 一、宏观解释内存映射 二、进程虚拟地址空间 三、虚拟内存区域描述符 四、内存映射的实现 五、mmap在Framebuffer中的应用 前几天的一场面试中&#xff0c;面试官问&#xff1a;为什么可以通过mmap直接操作LCD&#xff1f; 当…

上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡反弹&#xff0c;午后集体拉升涨超1%&#xff0c;深成指一度涨超1.5%&#xff0c;随后涨幅略…

CSP 202104-1 灰度直方图

答题 就是记录每个数出现的次数&#xff0c;用C的map就行 #include<iostream> #include<map> using namespace std; int main(){map<int,int>h;int n,m,L,a;cin>>n>>m>>L;for(int i0;i<L;i){h[i]0;}while(n--){for(int i0;i<m;i){…

django configparser.NoSectionError: No section: ‘Samples

django configparser.NoSectionError: No section: Samples 背景&#xff1a;Windows下的Django项目&#xff0c;重新部署至Linux ubuntu20中。 samples_white_list eval(config.get(‘Samples’, ‘samples_white_list’)) File “/home/hhl/anaconda3/envs/django/lib/pytho…

Python + Jmeter 实现自动化性能压测

Step01: Python脚本开发 文件路径&#xff1a;D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用&#xff1a; 1.通过 grpc 调用底层 c 的接口&#xff0c;做数据库的数据插入与查询操作&#xff0c;然后将返回的结果进行拼接与输出。 2.代码里面…

optimizer和loss.backward()相关函数

optimizer.zero_grad() # 梯度清零(一定要先进行梯度清零&#xff0c;这样tensor里面的grad就不会累加) loss.backward()是用来求导的 optimizer.step()一般来说根据求来的导数进行梯度下降算法来更新参数 上面的顺序步骤不能变

Idea启动报错start failed闪退, RestfulToolkit-fix插件问题

前一天下班时还在正常使用的Idea&#xff0c;早上再次启动就报错闪退&#xff0c;报错信息非常的快的闪退也没有看清楚。做过的唯一更改就是前一天安装了 RestfulToolkit-fix 插件。 1、先查看报错的日志 在Idea安装路径的bin/ idea.bat文件中末尾处添加pause语句 保存后双击…

Python绘图系统16:动态更新tkinter组件

文章目录 前情提要源代码模式输入序列源码 Python绘图系统&#xff1a; &#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;极坐标&#x1f4c9;绘图风格&#x1f4c9;风格控件图表类型和…