Java读取XML文件
使用Java读取XML文件有四种方式:
- DOM
- SAX
- JDOM
- DOM4j
book.xml文件内容:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <书架> 3 <书> 4 <书名 编号="a_1">JavaWeb程序开发入门</书名> 5 <作者 分类="AA">传智播客</作者> 6 <售价 单位="元">60</售价> 7 </书> 8 <书> 9 <书名 编号="a_2">JavaWeb从入门到精通</书名> 10 <作者 分类="BB">明日科技</作者> 11 <售价>80</售价> 12 </书> 13 <书> 14 <书名 编号="a_3">计算机文化基础</书名> 15 <作者 分类="CC">山东商务</作者> 16 <售价>40</售价> 17 </书> 18 </书架>
1.DOM
DOM 解析 XML 的步骤:
1) 创建一个 DocumentBuilderFactory 的对象。
2) 创建一个 DocumentBuilder 对象。
3) 通过DocumentBuilder的parse(...)方法得到Document对象。
4) 通过 getElementsByTagName(...)方法获取到节点的列表。
5) 通过 for 循环遍历每一个节点。
6) 得到每个节点的属性和属性值。
7) 得到每个节点的节点名和节点值。
NodeType解释:
Node(节点)是DOM层次结构中的任何类型的对象的通用名称,Node有很多类型,如元素节点,属性节点,文本节点,注释节点等,通过NodeType区分,常见的有:
节点类型 | NodeType |
---|---|
元素element | 1 |
属性attribute | 2 |
文本text | 3 |
注释comment | 8 |
文档document | 9 |
1 import javax.xml.parsers.DocumentBuilder; 2 import javax.xml.parsers.DocumentBuilderFactory; 3 4 import org.w3c.dom.Document; 5 import org.w3c.dom.Element; 6 import org.w3c.dom.Node; 7 import org.w3c.dom.NodeList; 8 9 10 public class DomXmlDemo { 11 12 // 用Element方式 13 public static void element(NodeList list) { 14 for (int i = 0; i < list.getLength(); i++) { 15 Element element = (Element) list.item(i); 16 NodeList childNodes = element.getChildNodes(); 17 for (int j = 0; j < childNodes.getLength(); j++) { 18 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) { 19 // 获取节点 20 System.out.print(childNodes.item(j).getNodeName() + ":"); 21 // 获取节点值 22 System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); 23 } 24 } 25 } 26 } 27 28 // 用Node方式 29 public static void node(NodeList list) { 30 for (int i = 0; i < list.getLength(); i++) { 31 Node node = list.item(i); 32 NodeList childNodes = node.getChildNodes(); 33 for (int j = 0; j < childNodes.getLength(); j++) { 34 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) { 35 System.out.print(childNodes.item(j).getNodeName() + ":"); 36 System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); 37 } 38 } 39 } 40 } 41 42 public static void main(String[] args) { 43 // 1.创建DocumentBuilderFactory对象 44 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 45 // 2.创建DocumentBuilder对象 46 try { 47 DocumentBuilder builder = factory.newDocumentBuilder(); 48 Document d = builder.parse("src/book.xml"); 49 NodeList sList = d.getElementsByTagName("书"); 50 element(sList);// Element方式 51 // node(sList); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 } 56 }
运行结果:
2.SAX
SAX 方式解析:以事件驱动的XML API,边扫描边解析,解析速度快占用内存少(逐行解析)。
SAX 解析 XML 的步骤:
1) 创建 SAXParserFactory 的对象。
2) 创建 SAXParser 对象(解析器)。
3) 创建一个 DefaultHandler 的子类,并且重写里面的方法。
4) 调用 parse 方法,传入DefaultHandler的子类对象。
DefaultHandler类解释:
在DefaultHandler中有几个比较重要的方法。
1. public void startDocument() throws SAXException
第一个执行方法。
2. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
该方法是继第一个方法后第二个执行方法。
3. public void characters(char[] ch, int start, int length) throws SAXException
这个是继startElement方法后的执行方法。
该方法中的ch把所解析的xml的所有数据都保存进来,且ch初始化为2K数据。start是一个节点">"的位置。length就是">"到下一个"<"的长度。
4. public void endElement(String uri, String localName, String qName) throws SAXException
若一个节点,比如<name>michael</name>,在执行完characters后会执行该方法。如果节点,比如<names><name>michael</name></names>在执行names节点时,不会执行到该方法。
5. public void endDocument() throws SAXException
最后一个执行方法。
1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.xml.sax.SAXException; 6 import org.xml.sax.helpers.DefaultHandler; 7 8 public class SaxXmlDemo { 9 10 public static void main(String[] args) throws Exception { 11 // 1.获取SAXParserFactory实例 12 SAXParserFactory factory = SAXParserFactory.newInstance(); 13 // 2.获取SAXparser实例 14 SAXParser saxParser = factory.newSAXParser(); 15 // 3.创建DefaultHandler的子类对象 16 SAXDemoHandler handler = new SAXDemoHandler(); 17 // 4.调用parse()方法,传入DefaultHandler的子类对象 18 saxParser.parse("src/book.xml", handler); 19 } 20 } 21 22 class SAXDemoHandler extends DefaultHandler { 23 // 遍历xml文件开始标签 24 @Override 25 public void startDocument() throws SAXException { 26 super.startDocument(); 27 System.out.println("sax解析开始"); 28 } 29 30 // 遍历xml文件结束标签 31 @Override 32 public void endDocument() throws SAXException { 33 super.endDocument(); 34 System.out.println("sax解析结束"); 35 } 36 37 @Override 38 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 39 super.startElement(uri, localName, qName, attributes); 40 if (qName.equals("书")) { 41 System.out.println("============开始遍历============="); 42 } else if (!qName.equals("书") && !qName.equals("书架")) { 43 System.out.print("节点名称:" + qName); // 输出节点名称 44 for (int i = 0; i < attributes.getLength(); i++) { 45 System.out.print(", 属性:" + attributes.getQName(i) + "=" + attributes.getValue(i)); 46 } 47 } 48 } 49 50 @Override 51 public void endElement(String uri, String localName, String qName) throws SAXException { 52 super.endElement(uri, localName, qName); 53 if (qName.equals("书")) { 54 System.out.println(qName + ":遍历结束"); 55 System.out.println("============结束遍历============"); 56 } 57 } 58 59 @Override 60 public void characters(char[] ch, int start, int length) throws SAXException { 61 super.characters(ch, start, length); 62 String value = new String(ch, start, length).trim(); 63 if (!value.equals("")) { 64 System.out.println(", 节点内容:" + value); // 输出节点内容 65 } 66 } 67 }
运行结果:
3.JDOM
JDOM 解析:是一种解析XML的JAVA工具包,是基于树形结构,利用纯JAVA技术对XML文档实现解析,只适用于JAVA语言。
JDOM解析XML的步骤:
1) 创建一个 SAXBuilder 对象。
2) 调用 build 方法,得到 Document 对象(通过 IO 流)。
3) 获取根节点。
4) 获取根节点的直接子节点的集合。
5) 遍历集合。
到 http://www.jdom.org/downloads/index.html 下载jar包,有1.1.3和2.0.6两个,我们下载,复制到项目的lib目录中,右键添加的Build Path中。
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.InputStream; 4 import java.util.List; 5 6 import org.jdom2.Attribute; 7 import org.jdom2.Document; 8 import org.jdom2.Element; 9 import org.jdom2.input.SAXBuilder; 10 11 public class JdomXmlDemo { 12 13 public static void main(String[] args) throws Exception { 14 // 1.创建SAXBuilder对象 15 SAXBuilder saxBuilder = new SAXBuilder(); 16 // 2.创建输入流 17 InputStream is = new FileInputStream(new File("src/book.xml")); 18 // 3.将输入流加载到build中 19 Document document = saxBuilder.build(is); 20 // 4.获取根节点 21 Element rootElement = document.getRootElement(); 22 // 5.获取子节点 23 List<Element> children = rootElement.getChildren(); 24 for (Element child : children) { 25 List<Attribute> attributes = child.getAttributes(); 26 // 打印属性 27 for (Attribute attr : attributes) { 28 System.out.println(attr.getName() + ":" + attr.getValue()); 29 } 30 List<Element> childrenList = child.getChildren(); 31 System.out.println("======获取子节点-start======"); 32 for (Element e : childrenList) { 33 System.out.println("节点名:" + e.getName() + ", 节点值:" + e.getValue()); 34 List<Attribute> childAttributes = e.getAttributes(); 35 for (Attribute attr : childAttributes) { 36 System.out.println(attr.getName() + "=" + attr.getValue()); 37 } 38 } 39 System.out.println("======获取子节点-end======"); 40 } 41 } 42 43 }
运行结果:
4.DOM4j
DOM4J :DOM4J是一个JAVA的XML API,JDOM的升级版。
DOM4J 解析 XML 的步骤:
1) 创建 SAXReader 对象。
2) 调用 read 方法。
3) 获取根元素。
4) 通过迭代器遍历直接节点。
通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。
1 import java.io.File; 2 import java.util.Iterator; 3 import java.util.List; 4 5 import org.dom4j.Attribute; 6 import org.dom4j.Document; 7 import org.dom4j.Element; 8 import org.dom4j.io.SAXReader; 9 10 public class Dom4jXmlDemo { 11 12 public static void main(String[] args) throws Exception { 13 // 1.创建Reader对象 14 SAXReader reader = new SAXReader(); 15 // 2.加载xml 16 Document document = reader.read(new File("src/book.xml")); 17 // 3.获取根节点 18 Element rootElement = document.getRootElement(); 19 Iterator<Element> iterator = rootElement.elementIterator(); 20 while (iterator.hasNext()) { 21 Element child = (Element) iterator.next(); 22 List<Attribute> attributes = child.attributes(); 23 System.out.println("======获取属性值-start======"); 24 for (Attribute attribute : attributes) { 25 System.out.println(attribute.getName() + "=" + attribute.getValue()); 26 } 27 System.out.println("======获取属性值-end======"); 28 System.out.println("======遍历子节点-start======"); 29 Iterator<Element> childIterator = child.elementIterator(); 30 while (childIterator.hasNext()) { 31 Element e = (Element) childIterator.next(); 32 System.out.println("节点名:" + e.getName() + ",节点值:" + e.getStringValue()); 33 List<Attribute> childAttributes = e.attributes(); 34 for (Attribute attr : childAttributes) { 35 System.out.println(attr.getName() + "=" + attr.getValue()); 36 } 37 } 38 System.out.println("======遍历子节点-end======"); 39 } 40 } 41 }
运行结果:
四种解析 XML 的特点
1.DOM 解析:
形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。
2.SAX 解析:
采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时。
3.JDOM 解析:
仅使用具体类,而不使用接口。API 大量使用了 Collections 类。
4.DOM4J解析:
使用接口和抽象基本类方法。性能优异,灵活性好,功能强大和易于使用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库