02.XML的解析方式

XML的解析方式

XML的解析方式分为四种:

https://www.cnblogs.com/longqingyang/p/5577937.html

1、DOM解析(基础方法)

优点:

      	1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

     		2、解析过程中,树结构保存在内存中,方便修改。

   		 缺点:

      	1、由于文件是一次性读取,所以对内存的耗费比较大。

     		2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

2、SAX解析(基础方法)

​  优点:

1、采用事件驱动模式,对内存耗费比较小。

2、适用于只处理XML文件中的数据时。

缺点:

1、编码比较麻烦。

2、很难同时访问XML文件中的多处不同数据。 语法:
Oracle提供(javax.xml),内置在JDK中

package javaWebSenoirDemo01;
import java.io.File;

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;

/**
* 	使用SAX解析XML文件
* 		优点:因为每次只读取其中一行内容,所以占用内存很小
* 		缺点:只适用于读取
* @author Java53
*
*/
public class MySAXReaderXml {
public static void main(String[] args) throws Exception {
// 声明File对象指向被解析的XML文件
File f = new File("D:/test.xml");
// 创建SAX解析器工厂
SAXParserFactory spf = 

SAXParserFactory.newInstance();
// 通过SAX解析器工厂创建SAX解析器
SAXParser sap = spf.newSAXParser();
// File:指向被解析的XML文件对象,DefaultHandler:解

析处理器,解析的核心处理操作
sap.parse(f, new MyHandler());
}
}

class MyHandler extends DefaultHandler {
//解析文档开始时,解析器会调用该方法
@Override
public void startDocument() throws SAXException {
System.out.println("----- 开始解析XML文件 -----");
}
//碰到元素开始标签执行该方法
@Override
public void startElement(String uri, String localName, 

String qName, Attributes attributes) throws SAXException {
//qName:当前碰到的开始标签的标签名 attributes属性
System.out.println("开始:"+qName);
}
//当碰到标签中的文本内容时,执行该方法
@Override
public void characters(char[] ch, int start, int length) 

throws SAXException {
String text = new String(ch,start,length);
System.out.println(text.trim());
}
//碰到元素结束标签执行该方法
@Override
public void endElement(String uri, String localName, String 

qName) throws SAXException {
//qName:当前碰到的结束标签的标签名
System.out.println("结束:"+qName);
}
//解析文档结束时,解析器会调用该方法
@Override
public void endDocument() throws SAXException {
System.out.println("----- 解析XML文件结束 -----");
}
}

3、JDOM解析(扩展方法)-(只适用于java平台)

​  特征:

1、仅使用具体类,而不使用接口。

2、API大量使用了Collections类。

4、DOM4J解析(扩展方法)-(只适用于java平台)

​ 特征:

1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。

2、它使用接口和抽象基本类方法。

3、具有性能优异、灵活性好、功能强大和极端易用的特点。

4、是一个开放源码的文件
语法:

//声明文件对象指向的File类
File f = new File("H:\\javaWeb高级\\xml\\notepad01.xml");
//到dom4j包
//创建XML文件读取对象
SAXReader saxR = new SAXReader();
//创建Dom4J核心对象,读取xml里的值
Document d = saxR.read(f);
//获取文件根节点元素
Element root = d.getRootElement();
//寻找到根节点下要添加的子元素
List<Element> list = root.element("friends").elements();


//循环添加
for(Element es:list) {
es.addElement("tanghao").setText("小小");
}
//同步文件
XMLWriter xw = new XMLWriter(new OutputStreamWriter(new FileOutputStream

(f),"UTF-8"));
//像文件中写入当前的Document对象
xw.write(d);
//将缓冲区的内容压缩到文件中去
xw.flush();

在java后台生成XML文件:

https://blog.csdn.net/yz357823669/article/details/79106732

综合案例:

package com.zuxia.xml;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

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

public class MyEocumentText {

	public static void main(String[] args) throws Exception {
		//声明文件对象指向的File类
		File f = new File("E:/javaWeb高级/xml/notepad01.xml");
		//到dom4j包
		//创建XML文件读取对象
		SAXReader saxR = new SAXReader();
		//创建Dom4J核心对象
		Document d = saxR.read(f);
		//获取文件根节点元素
		Element root = d.getRootElement();
		//获取根元素下的子节点的子节点
		//root.element("businessCard").elements();
		//将新的元素添加到子节点下
		root.addElement("height").setText("1.70");
		//创建字节写入流文件

//		OutputStreamWriter osw = new OutputStreamWriter(fos);
//		FileOutputStream fos = new FileOutputStream(f);
		//同步文件
		XMLWriter xw = new XMLWriter(new OutputStreamWriter(new FileOutputStream

(f),"UTF-8"));
		

		//向文件中写入当前程序中的Document对象
		xw.write(d);
		//将缓冲区的内容压到文件中
		xw.flush();
		
	}

}

案例:自定义xml文档

<?xml version="1.0" encoding="UTF-8"?>
<!--XML的文件开头 --><!-- 文件内容:信息载体部分--><!-- 名片 --><businessCard>
	<name>张三</name>
	<sex></sex>
	<age>20</age>
	<address>重庆市沙坪坝</address>
	<friends>
		<friend>
			<name>老刘</name>
			<sex></sex>
			<age>21</age>
		<tanghao>小刘</tanghao><tanghao>小小</tanghao></friend>
		<friend>
			<name>老张</name>
			<sex></sex>
			<age>20</age>
		<tanghao>小刘</tanghao><tanghao>小小</tanghao></friend>
		<friend>
			<name>小明</name>
			<sex></sex>
			<age>18</age>
		<tanghao>小刘</tanghao><tanghao>小小</tanghao></friend>
	</friends>
	<hobby>
		<checked>睡觉</checked>
		<checked></checked>
		<checked>打游戏</checked>
		<checked>打篮球</checked>
	</hobby>
</businessCard>

案例:MyDomReaderDom

package javaWebSenoirDemo01;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class MyDomReaderDom {
	public static void main(String[] args) throws Exception {
		//创建Document对象需要用到Document创建工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//创建文档构建器
		DocumentBuilder db = dbf.newDocumentBuilder();
		//使用Document:JDK自带的DOM解析
		Document doc = db.parse(new File("D:/test.xml"));
		//获得文档的根元素节点
		Element e = doc.getDocumentElement();
		
		//创建一个元素节点
		Element heightElement = doc.createElement("height");
		//创建一个文本节点
		Text t = doc.createTextNode("1.33");
		//将文本节点添加到元素节点中
		heightElement.appendChild(t);
		
		//将刚刚创建的元素节点追加到根节点中
		e.appendChild(heightElement);
		
		//将程序中的XML内容同步到文件中
		//将Document对象转换为源对象
		DOMSource ds = new DOMSource(doc);
		//创建一个变换器工厂
		TransformerFactory tf = TransformerFactory.newInstance();
		//创建一个变换器类
		Transformer trans = tf.newTransformer();
		//创建结果流对象
		StreamResult sr = new StreamResult(new File("D:/test.xml"));
		//执行从DocumentSource到文件的写入操作
		trans.transform(ds, sr);
		
		//获取根节点的所有子节点的集合
		//NodeList nl = e.getChildNodes();
		
		//iter(nl);
	}
	
	public static void iter(NodeList nl){
		for(int i=0;i<nl.getLength();i++){
			//当迭代的节点
			Node n = nl.item(i);
			//当前迭代节点的类型
			short nodeType = n.getNodeType();
			if(nodeType==Node.TEXT_NODE){
				
			}else if(nodeType==Node.ELEMENT_NODE){
				System.out.print("节点名称:"+n.getNodeName());
				System.out.println("节点内容:"+n.getTextContent());
				if(n.getChildNodes().getLength()>0){
					iter(n.getChildNodes());
				}
			}
		}
	}
}

案例:MyDomReaderDom4j

package javaWebSenoirDemo01;

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

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

public class MyDomReaderDom4j {
	public static void main(String[] args) throws Exception {
		//声明文件对象指向被操作的XML文件
		File f = new File("D:/test.xml");
		//导入DOM4J的jar包
		//创建XML文件读取对象
		SAXReader sr = new SAXReader();
		//创建Dom4j核心对象
		Document d =sr.read(f);
		//获取根元素节点
		Element root = d.getRootElement();
		
		root.element("friends").elements();
		
		root.addElement("money").setText("18888");
		//同步文件
		XMLWriter xw = new XMLWriter(new OutputStreamWriter(new FileOutputStream(f),"UTF-8"));
		//向文件中写入当前程序中的Document对象
		xw.write(d);
		//将缓冲区的内容压到文件中
		xw.flush();
		//Element e = root.element("sex");
		//获取元素中的内容
		//String str = e.getText();
		//String str = root.elementText("address");
		
		//List<Element> es = root.elements();
		
		//for(Element e:es){
			//System.out.print(e.getName()+":");
			//System.out.println(e.getText());
		//}
		//System.out.println(str);
	}
}

案例:MySAXReaderXml

package javaWebSenoirDemo01;

import java.io.File;

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;

/**
 * 	使用SAX解析XML文件
 * 		优点:因为每次只读取其中一行内容,所以占用内存很小
 * 		
 * @author Java53
 *
 */
public class MySAXReaderXml {
	public static void main(String[] args) throws Exception {
		// 声明File对象指向被解析的XML文件
		File f = new File("D:/test.xml");
		// 创建SAX解析器工厂
		SAXParserFactory spf = SAXParserFactory.newInstance();
		// 通过SAX解析器工厂创建SAX解析器
		SAXParser sap = spf.newSAXParser();
		// File:指向被解析的XML文件对象,DefaultHandler:解析处理器,解析的核心处理操作
		sap.parse(f, new MyHandler());
	}
}

class MyHandler extends DefaultHandler {
	//解析文档开始时,解析器会调用该方法
	@Override
	public void startDocument() throws SAXException {
		System.out.println("----- 开始解析XML文件 -----");
	}
	//碰到元素开始标签执行该方法
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//qName:当前碰到的开始标签的标签名 attributes属性
		System.out.println("开始:"+qName);
	}
	//当碰到标签中的文本内容时,执行该方法
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String text = new String(ch,start,length);
		System.out.println(text.trim());
	}
	//碰到元素结束标签执行该方法
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		//qName:当前碰到的结束标签的标签名
		System.out.println("结束:"+qName);
	}
	//解析文档结束时,解析器会调用该方法
	@Override
	public void endDocument() throws SAXException {
		System.out.println("----- 解析XML文件结束 -----");
	}
}

案例:XmlAnalysis

package com.zuxia.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 xml01 {

	/**
	 *解析xml里的文件
	 * @param args
	 * @throws SAXException 
	 * @throws ParserConfigurationException 
	 */
	public static void main(String[] args) throws Exception {
		//创建文件访问目录
		File f=new File("C:/Program Files (x86)/Notepad++/notepad01.xml");
		//创建SAX解析器工厂
		SAXParserFactory spet=SAXParserFactory.newInstance();
		//通过解析工厂创建SAX解析器
		SAXParser sax=spet.newSAXParser();
		//通过File:指向被解析的XML文件对象  DefaultHandler:解析处理器,解析的核心文件处理
		sax.parse(f, new XmlHandler());
		
	}
}

//创建一个实例类
class XmlHandler extends DefaultHandler{
	//解析开始
	@Override
	public void startDocument() throws SAXException {
		System.out.println("----XML的开始解析----");
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes)
			throws SAXException {
		//qName:当前碰到开始标签的标签名  attributss属性
		System.out.println("开始:"+qName);
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//创建字符串对象
		String str=new String(ch,start,length);
		//输出对象 ,去掉空格
		System.out.println(str.trim());
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("结束:"+qName);
	}
	@Override
	public void endDocument() throws SAXException {
		System.out.println("----XML的解析结束----");
	}
	
}

案例:MyEocumentText

package com.zuxia.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

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

public class MyEocumentText {

	public static void main(String[] args) throws Exception {
		//声明文件对象指向的File类
		File f = new File("E:/javaWeb高级/xml/notepad01.xml");
		//到dom4j包
		//创建XML文件读取对象
		SAXReader saxR = new SAXReader();
		//创建Dom4J核心对象
		Document d = saxR.read(f);
		//获取文件根节点元素
		Element root = d.getRootElement();
		//获取根元素下的子节点的子节点
		//root.element("businessCard").elements();
		//将新的元素添加到子节点下
		root.addElement("height").setText("1.70");
		//创建字节写入流文件
//		OutputStreamWriter osw = new OutputStreamWriter(fos);
//		FileOutputStream fos = new FileOutputStream(f);
		//同步文件
		XMLWriter xw = new XMLWriter(new OutputStreamWriter(new FileOutputStream(f),"UTF-8"));
		
		//向文件中写入当前程序中的Document对象
		xw.write(d);
		//将缓冲区的内容压到文件中
		xw.flush();
		
	}
	
}

案例:MyEocument

package com.zuxia.xml;

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

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

public class MyEocument {

	public static void main(String[] args) throws Exception {
		//声明文件对象指向的File类
		File f = new File("H:\\javaWeb高级\\xml\\notepad01.xml");
		//到dom4j包
		//创建XML文件读取对象
		SAXReader saxR = new SAXReader();
		//创建Dom4J核心对象,读取xml里的值
		Document d = saxR.read(f);
		//获取文件根节点元素
		Element root = d.getRootElement();
		//寻找到根节点下要添加的子元素
		List<Element> list = root.element("friends").elements();
		
		//循环添加
		for(Element es:list) {
			es.addElement("tanghao").setText("小小");
		}
		//同步文件
		XMLWriter xw = new XMLWriter(new OutputStreamWriter(new FileOutputStream(f),"UTF-8"));
		//像文件中写入当前的Document对象
		xw.write(d);
		//将缓冲区的内容压缩到文件中去
		xw.flush();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Java自带的javax.xml库来解析XML文件。下面是一个简单的示例代码,演示如何使用javax.xml库来解析XML文件: ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XMLParser { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("example.xml"); NodeList nodeList = doc.getDocumentElement().getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println(node.getNodeName() + " : " + node.getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用了DocumentBuilder和DocumentBuilderFactory类来读取XML文件。我们首先实例化DocumentBuilderFactory,并调用其newDocumentBuilder()方法来创建一个DocumentBuilder对象。 然后,我们调用builder.parse()方法来读取XML文件,并将其作为一个Document对象返回。我们可以通过调用doc.getDocumentElement()方法来获得XML文件的根元素,并通过getChildNodes()方法获得所有子节点的列表。 最后,我们遍历子节点列表,并打印节点的名称和文本内容。如果节点是元素节点,我们将打印其文本内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值