Java基础之XML解析

本文详细介绍了XML的基础知识,包括XML的作用、语法规范和注释。接着讲解了DOM和SAX两种解析方式,DOM将XML转化为文档对象模型,适合小规模数据处理,而SAX采用事件驱动的“推”模型,适用于处理大规模XML数据。文章通过实例展示了DOM、SAX以及DOM4j解析和生成XML的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、XML解析

是一种可扩展性的标记语言(Extensible Markup Language),用于描述数据

应用场合:

       1、持久化存储数据

       2、数据交换

       3、数据配置

<?xml version="1.0" encoding="utf-8" ?>
<Person>
     <ID>1001</ID>
     <Name>张杰</Name>
     <Age>20</Age>
     <!-- -->
</Person>

简单说明一下上面的的内容:第一行是XML的声明,<Person>是根元素,<!-- -->是注释标记

元素由开始标签、元素内容和结束标签组成


XML语法-文档类型

1、在编写XML文档时,需要先使用文档声明,声明XML文档的类型

2、最简单的声明语法:<?xml version="1.0" ?>

2、用encoding属性说明文档的字符编码:<?xml version="1.0" encoding="GB2312" ?>

XML语法-元素

1、对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。

第一种

<Name>
     小白
</Name>

第二种

<Name>小白</Name>
以上两种看上去的意思是一样的代表了name为“小白”,但是在XML解析程序中,将第一种里的空格与换行当成一种标记,而第二种却没有,仅从效果上来讲两种的表达的效果是一样的。

2、由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

XML语法-注释

XML文件中的注释采用:"<!--内容-->"格式

注意:

1、XML声明之前不能有注释

2、注释不能有嵌套,如下面的情况,是不正确的

<!--大段注释
    ... ...
    <!--局部注释-->
    ... ...
-->

格式良好的XML文档

1、必须有XML声明语句

2、必须有且仅有一个根元素

3、标签大小写敏感

4、属性值用双引号或单引号

5、标签成对

6、元素正确嵌套

二、DOM(Document Object Model)解析

DOM解析是将XML文档在内存中转换成一个文档对象模型(通常称为DOM树),应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,DOM解析的机制也被称为随机访问机制。

注意:DOM解析对内存的需求比较高

DOM解析的步骤:

1、建立DocumentBuilderFactory

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2、建立DocumentBuilder

DocumentBuilder builder = factory.newDocumentBuilder();

3、建立Document

Document doc = builder.parse("需要读取的文件路径");

4、建立NodeList

NodeList nl = doc.getElementByTagName("读取标签名称");

5、进行XML信息读取


三、SAX(Simple APIs for XML)解析

SAX是一个用于处理XML事件驱动的“推”模型,在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。

通常用于查找、读取XML数据

SAX解析步骤:

1、编写SAX解析器,该解析器类继承自DefaultHandler类,同时重写相关方法。

2、建立SAX解析工厂

SAXParseFactory factory = SAXParseFactory.newInstance();

3、构造解析器

SAXParse parser = factory.newSAXParse();

4、解析XML

parser.parse("XML文件路径",解析器实例化对象);

XML解析的实现方式

DOM

      解析XML文档转换成DOM树进行解析。

SAX

     以事件通知的方法进行解析。

DOM4j解析XML

一、生成XML

Document doc = DocumentHelper.createDocument();

Element root = doc.addElement("schools");

Element school1 = root.addElement("school");

...

XMLWriter xw = new XMLWriter(outputStream,outputformat);

xw.write(doc);//将XML写入到磁盘上

二、解析XML

SAXReader sr = new SAXReader();

Document doc = sr.read("要读取的xml文件");

Element root = doc.getRootElement();//获取根元素

//获取根元素下的所有直属元素的迭代器

Iterator<Element> iter = root.elementIterator();


XML文件的编写

<?xml version="1.0" encoding="utf-8" ?>
<users>
	<user>
		<id>12</id>
		<name>小白</name>
		<adds>
			<address type="home">
				<province>河南省</province>
				<city>郑州市</city>
			</address>
			<address type="eork">
				<province>陕西省</province>
				<city>西安市</city>
			</address>
		</adds>
	</user>
	<user>
		<id>13</id> 
		<name>大白</name>
		<adds>
			<address type="home">
				<province>陕西省</province>
				<city>商洛市</city>
			</address>
			<address type="eork">
				<province>浙江省</province>
				<city>杭州市</city>
			</address>
		</adds>
	</user>
</users>

DOM解析的实例:

在这里我们用到的XML文件是我们上面所写到的userInfo.xml文件

package dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

/**
 * 将XML文件在内存中解析成DOM树
 */
public class DOMParseDemo {

	public static void main(String[] args) {
		//建立DocumentBuilderFactory
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//建立DocumentBuilder
		DocumentBuilder builder = null;
		try {
			builder = factory.newDocumentBuilder();
			//建立Document,并将XML文件在内存中解析成DOM树
			Document doc = builder.parse(new File("f:" + File.separator + "userInfo.xml"));
			//获取所有标签名为province的节点
			NodeList node = doc.getElementsByTagName("province");
			String value = node.item(3).getFirstChild().getTextContent();
			System.out.println(value);
			System.out.println(node.item(3).getNodeName());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

运行结果:


使用DOM创建XML文件实例:

package dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class DOMCreateDemo {

	public static void main(String[] args) {
		//建立DocumentBuilderFactory
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			//建立DocumentBuilder
			DocumentBuilder builder = factory.newDocumentBuilder();
			//新建Document
			Document doc = builder.newDocument();
			Element students = doc.createElement("students");
			Element student = doc.createElement("student");
			Element name = doc.createElement("name");
			Element score = doc.createElement("score");
			Text nameText = doc.createTextNode("张三");
			Text scoreText = doc.createTextNode("93.5");
			students.appendChild(student);
			student.appendChild(name);
			student.appendChild(score);
			name.appendChild(nameText);
			score.appendChild(scoreText);
			doc.appendChild(students);
			TransformerFactory tfFactory = TransformerFactory.newInstance();
			Transformer tf = tfFactory.newTransformer();
			tf.setOutputProperty(OutputKeys.ENCODING,"utf-8");
			DOMSource source = new DOMSource(doc);//生成DOMSource,里面携带了document对象
			//StreamResult封装了目标输出流文件
			StreamResult sr = new StreamResult(new File("f:" + File.separator + "mydom.xml"));
			tf.transform(source, sr);//开始向磁盘中写入
			System.out.println("XML文件创建成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

运行结果:



SAX解析DOM实例:

代码中用到的XML文件是上面的userInfo.xml文件

package sax;

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

//自定义SAX解析器
public class MySAXHandler 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.getLocalName(i) + "=\"" + attributes.getValue(i) + "\"");
		}
		System.out.print(">");
	}
	
	//结束解析元素时,自动调用该方法
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.print("</" + qName + ">");
	}
	
	//解析到文本数据时,自动调用该方法
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.print(new String(ch,start,length));
	}
	
	@Override
	public void endDocument() throws SAXException {
		System.out.println("文档解析结束...");
	}
}
package sax;

import java.io.File;

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

public class SAXDemo {

	public static void main(String[] args) {
		//建立SAX解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//构造解析器
		try {
			SAXParser parser = factory.newSAXParser();
			parser.parse(new File("f:" + File.separator + "userInfo.xml"), new MySAXHandler());
		} catch (Exception e) {	
			e.printStackTrace();
		}
	}

}

运行结果:

DOM4j解析XML实例:

package dom4j;

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

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

public class DOM4jReaderDemo {
	public static void main(String[] args) {
		SAXReader sr = new SAXReader();
		try {
			Document doc = sr.read(new File("f:" + File.separator + "userInfo.xml"));
			Element root = doc.getRootElement();//获取根元素
			//获取根元素下的所有直属元素的迭代器
			Iterator<Element> iter = root.elementIterator();
			while(iter.hasNext()) {
				Element e = iter.next();//获取根元素下的每个直属元素
				List<Element> addressList = e.element("adds").elements("address");
				for(Element n : addressList) {
					String cityText = n.element("city").getText();
					System.out.println(cityText);
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

运行结果:


DOM4j生成XML文档实例:

package dom4j;

import java.io.*;

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

// DOM4j生成XML文档
public class DOM4jCreateDemo {
	public static void main(String[] args) {
		Document doc = DocumentHelper.createDocument();
		Element root = doc.addElement("schools");
		Element school1 = root.addElement("school");
		Element name1 = school1.addElement("name");
		name1.setText("清华大学");
		Element address1 = school1.addElement("address");
		address1.setText("北京");
		
		Element school2 = root.addElement("school");
		Element name2 = school2.addElement("name");
		name2.setText("中山大学");
		Element address2 = school2.addElement("address");
		address2.setText("广州");
		
		//设置输出属性
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");//设置输出编码
		XMLWriter xw = null;
		try {
			xw = new XMLWriter(new FileOutputStream("f:" + File.separator + "mydom4j.xml"),format);
			xw.write(doc);//写出XML到磁盘上
			System.out.println("写出成功!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值