Java操作XML文件

Java操作XML文件目录一、使用DOM4j进行XML的DOM解析1.1、使用DOM4j查询XML文档1.2、使用DOM4j修改XML文档1.3、使用xPath技术二、使用SAX方式解析XML文档2.1、使用SAX解析方式查询XML文档2.2、对比DOM解析和SAX解析Java中有两种解析XML文件的方式:DOM解析和SAX解析。一、使用DOM4j进行XML的DOM解析…

大家好,又见面了,我是你们的朋友全栈君。

目录

一、使用DOM4j进行XML的DOM解析

1.1、使用DOM4j查询XML文档

1.2、使用DOM4j修改XML文档

1.3、使用xPath技术

二、使用SAX方式解析XML文档

2.1、使用SAX解析方式查询XML文档

2.2、对比DOM解析和SAX解析


    Java中有两种解析XML文件的方式:DOM解析和SAX解析。

一、使用DOM4j进行XML的DOM解析

    DOM解析是一次性将整个XML文档加载进内存,在内存中构建Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到XML文档的内容。

    通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。

1.1、使用DOM4j查询XML文档

    XML文档在DOM解析中可以被映射为多种节点,其中比较重要和常见的是元素节点(Element)、属性节点(Attribute)和文本节点(Text)。

    查询节点主要可以使用以下方法:

  • Document new SAXReader().read(File file)    ——    读取XML文档 
  • Element Document.getRootElement()    ——    获取XML文档的根元素节点
  • Iterator Element.nodeIterator()    ——    获取当前元素节点下的所有子节点
  • Iterator<Element> Element.elementIterator(元素名)    ——    指定名称的所有子元素节点
  • Iterator<Attribute> Element.attributeIterator()    ——    获取所有子属性节点
  • List<Element> Element.elements()    ——    获取所有子元素节点
  • List<Attribute> Element.attributes()    ——    获取所有子属性字节
  • Element Element.element(元素名)    ——    指定名称的第一个子元素节点
  • Attribute Element.attribute(属性名)    ——    获取指定名称的子属性节点
  • String Element.attributeValue(属性名)    ——    获取指定名称的子属性的属性值
  • String Attribute.getName()    ——    获取属性名称
  • String Attribute.getValue()    ——    获取属性值
  • String Element.getText()    ——    获取当前元素节点的子文本节点
  • String Element.elementText(元素名)    ——    获取当前元素节点的指定名称的子文本节点

    示例:在eclipse中读取以下students.xml文档的内容,并打印至控制台

<?xml version="1.0" encoding="UTF-8"?>

<Students>
  <Student id="001">
    <name>张三</name>
    <age>19</age>
    <gender>男</gender>
    <grade>计算机1班</grade>
  </Student>
  <Student id="002">
    <name>李四</name>
    <age>20</age>
    <gender>男</gender>
    <grade>计算机2班</grade>
  </Student>
</Students>
package xml;

import java.io.File;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ReadAndPrintXML {
	public static void main(String[] args) throws Exception {
		// 创建一个XML解析器对象
		SAXReader reader = new SAXReader();
		// 读取XML文档,返回Document对象
		Document document = reader.read(new File("E:\\xml\\students.xml"));
		
		// 获取根元素节点
		Element root = document.getRootElement();
		StringBuilder sb = new StringBuilder();
		recursion(root, sb);
		System.out.println(sb.toString());
	}
	
	private static void recursion(Element ele, StringBuilder sb) {
		sb.append("<");
		// 解析元素节点
		sb.append(ele.getName());
		
		// 解析属性节点
		List<Attribute> attributes = ele.attributes();
		for(Attribute attribute : attributes) {
			sb.append(" ");
			sb.append(attribute.getName());
			sb.append("=");
			sb.append(attribute.getValue());
		}
		
		sb.append(">");
		
		// 解析文本节点
		sb.append(ele.getText());
		
		// 递归解析元素节点
		List<Element> elements = ele.elements();
		for(Element element : elements) {
			recursion(element, sb);
		}
		
		sb.append("<" + ele.getName() + "/>\n");
	}

}

1.2、使用DOM4j修改XML文档

    ①写出内容到xml文档

    XMLWriter writer = new XMLWriter(OutputStream out, OutputFormat format)

    writer.write(Document doc)

    上面的OutputFormat对象可以由OutputFormat类的两个静态方法来生成:

  • createPrettyPrint()    ——    生成的OutputFormat对象,使写出的XML文档整齐排列,适合开发环境使用
  • createCompactFormat()    ——    生成的OutputFormat对象,使写出的XML文档紧凑排列,适合生产环境使用

    ②生成文档或增加节点

  • Document DocumentHelper.createDocument()    ——    生成一个新的XML Document对象
  • Element Element.addElement(元素节点名)    ——    增加一个子元素节点
  • Attribute Element.addAttribute(属性名,属性值)    ——    增加一个子属性节点

    ③修改节点

  • Attribute.setValue(属性值)    ——    修改属性节点值
  • Attribute Element.addAttribute(同名属性名,属性值)    ——    修改同名的属性节点值
  • Element.setText(内容)    ——    修改文本节点内容

    ④删除节点

  • Element.detach()    ——    删除元素节点
  • Attribute.detach()    ——    删除属性节点

    示例:生成一个和前面的students.xml一样的XML文档,并写入到磁盘

import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class WriteXML {
	public static void main(String[] args) throws Exception {
		// 创建一个XMLWriter对象
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(new FileOutputStream("E:\\xml\\students2.xml"), format);
		// 生成一个新的Document对象
		Document doc = DocumentHelper.createDocument();
		// 增加Students元素节点
		Element students = doc.addElement("Students");
		// 增加两个Student元素节点
		Element student1 = students.addElement("student");
		Element student2 = students.addElement("student");
		// 为两个Student元素节点分别增加id属性节点
		student1.addAttribute("id", "001");
		student2.addAttribute("id", "002");
		// 分别增加name, age, gender, grade元素子节点
		student1.addElement("name").setText("张三");
		student1.addElement("age").setText("19");
		student1.addElement("gender").setText("男");
		student1.addElement("grade").setText("计算机1班");
		student2.addElement("name").setText("李四");
		student2.addElement("age").setText("20");
		student2.addElement("gender").setText("男");
		student2.addElement("grade").setText("计算机2班");
		// 将Document对象写入磁盘
		writer.write(doc);
		writer.close();
	}
}

1.3、使用xPath技术

    使用dom4j查询比较深的层次结构的节点时,比较麻烦,因此可以使用xPath技术快速获取所需的节点对象。

    首先也需要在eclipse中导入xPath的jar包,我这里使用的是jaxen-1.1-beta-6.jar

    ①使用xPath的方法

  • List<Node>  Document.selectNodes(xpath表达式)    ——    查询多个节点对象
  • Node  Document.selectSingleNode(xpath表达式)    ——    查询一个节点对象

    ②xPath表达式语法

  • /     ——    绝对路径,表示从xml文档的根位置开始
  • //    ——    相对路径,表示不分任何层次结构的选择元素
  • *    ——    表示匹配所有元素
  • []    ——    条件,表示选择符合条件的元素
  • @    ——    属性,表示选择属性节点
  • and    ——    关系,表示条件的与关系
  • text()    ——    文本,表示选择文本内容

    示例:

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPathTest {
	public static void main(String[] args) throws Exception {
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("E:\\xml\\students.xml"));
		
		// 选择所有的student元素
		List<Node> list = doc.selectNodes("//Student");
		
		// 选择文本内容是"张三"的name元素
		Element name = (Element) doc.selectSingleNode("//name[text()='张三']");
		
		// 选择所有id属性节点
		List<Node> list2 = doc.selectNodes("//@id");
		
		// 选择id属性为002的student元素
		Element student = (Element) doc.selectSingleNode("//Student[@id='002']");
		
		// 选择根元素节点的所有子节点
		Element root = doc.getRootElement();
		List<Node> list3 = doc.selectNodes("/Students/*");
	}
}

二、使用SAX方式解析XML文档

    SAX方式解析的原理是:在内存中加载一点,读取一点,处理一点。对内存要求比较低。

    JDK内置了SAX解析工具,存放在org.xml.sax包中。

2.1、使用SAX解析方式查询XML文档

    核心的API类:

        1、SAXParser.parse(File f, DefaultHandler dh)方法:解析XML文件

            参数一File:表示读取的XMl文件

            参数二DefaultHandler:SAX事件处理程序,包含SAX解析的主要逻辑。开发人员需要写一个DefaultHandler的子类,然后将其对象作为参数传入parse()方法。

       2、 SAXParserFactory类,用于创建SAXParser对象,创建方式如下:

            SAXParser parse = SAXParserFactory.newInstance().newSAXParser();

       3、DefaultHandler类的主要方法:

  •     void startDocument()    ——    在读到文档开始时调用
  •     void endDocument()    ——    在读到文档结束时调用
  •     void startElement(String uri, String localName, String qName, Attributes attributes)    ——    读到开始标签时调用
  •     void endElement(String uri, String localName, String qName)    ——    读到结束标签时调用
  •     characters(char[] ch, int start int length)    ——    读到文本内容时调用

    示例:使用SAX解析方式读取上面students.xml的内容,并打印至控制台。

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXTest {
	public static void main(String[] args) throws Exception {
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		parser.parse(new File("E:\\xml\\students.xml"), new MyDefaultHandler());
	}
}

class MyDefaultHandler extends DefaultHandler{
	@Override
	public void startDocument() throws SAXException {
		System.out.println("----文档开始解析-------");
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.print("<" + qName);
		
		for(int i = 0; i < attributes.getLength(); i++) {
			System.out.print(" " + attributes.getQName(i) + "=" + attributes.getValue(i));
		}
		System.out.print(">");
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.print(new String(ch, start, length));
	}
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.print("</" + qName + ">");
	}
	
	@Override
	public void endDocument() throws SAXException {
		System.out.println("\n----文档开始解析结束-----");
	}
}

 Java操作XML文件

2.2、对比DOM解析和SAX解析

Java操作XML文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156676.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qt集成ziplib压缩文件和目录「建议收藏」

    qt集成ziplib压缩文件和目录「建议收藏」今天本来想完成压缩文件的任务,结果并没有想象中那么轻松,1.qt自带有压缩工具,但是不考虑,因为qCompress主要用来压缩字节流,就算自己封装成压缩文件,也只能用qt的接口进行解压,可项目需要的是一个通用的压缩工具,2.zlib+quazipzlib官网:http://www.zlib.net/quazip参考http://quazip.sourceforge.net/cla…

    2022年7月26日
    26
  • PHP json_encode float

    PHP json_encode floatPHPjson_encodefloat乐杨俊

    2022年7月14日
    19
  • lcd像素点密度_常见液晶显示分辨率对应像素密度[通俗易懂]

    lcd像素点密度_常见液晶显示分辨率对应像素密度[通俗易懂]液晶屏尺寸主流屏幕分辨率屏幕像素密度(PPI)产品类型800×4803英寸:3113.5英寸:2664英寸:233960×6403.5英寸:3294英寸:2884.3英寸:2681280×7204.3英寸:3414.7英寸:3125英寸:2931920×10805英寸:4407英寸:3142048x1080_2K6英寸:3857英寸:3301280×8007英寸:2158英寸…

    2022年6月12日
    127
  • 超详细的springBoot学习笔记

    超详细的springBoot学习笔记SpringBoot1.SpringBoot简介Spring诞生时是Java企业版(JavaEnterpriseEdition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相…

    2022年10月21日
    5
  • vue-router 基本使用「建议收藏」

    vue-router 基本使用「建议收藏」vue-router基本使用  路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about按钮,页面中就要显示about的内容。Home按钮=>home内容,about按钮=>about内容,也可以说是一种映射.所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分。  点击之后,…

    2022年7月11日
    19
  • slf4j如何使用_正确刷牙方法图解

    slf4j如何使用_正确刷牙方法图解环境说明Windows101803IDEA2018.2.EAPMaven3.5.2这是正文POM文件&lt;!–https://mvnrepository.com/artifact/org.projectlombok/lombok–&gt;&lt;dependency&gt;&lt;groupId&g…

    2025年9月14日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号