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();
}
}