01.XML笔记

XML笔记

1、XML概念

为什么需要学习XML解析
	用于在不同的平台之间进行数据交互
什么是XML(EXtensible Marup Language:可扩展标记语言)
	一个格式特殊的文本文档,类似于HTML文件,按照特定的格式对数据进行封装和相互之间消息传递的技术。
特点
	自定义标签(<标签名>内容/其他标签</标签名>)的
	具有自我描述性
	树形结构(只能有一个根节点)
结构
	树形结构
	只有一个根节点
语法
	1、所有元素必须关闭
	2、XML文件是大小写敏感的
	3、必须正确地嵌套
	4、有且只有一个根节点
	5、特殊值需要加引号
	6、特殊符号需要转义
:&gt;
<:&lt;
":&quot;
':&apos;
&:&amp;
文档:Document
指XML文件本身
元素节点:Element
从一个标签的开始到末尾,称之为一个元素节点

属性节点:Attribute
元素节点中,声明在前标签中,以键值对的形式存在
文本节点:Text
在元素节点的开始标签与结尾标签之间,以文本的形式存在

通过XML 分离HTML中的数据
	通过XML,数据能够储存在独立的xml文件中 ,这样就可以专注于使用HTML进行布局和显示,并确保修改底层数据的时候不需要对XTML进行任何的修改

XML 简化数据共享
	在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。

	XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。

	这让创建不同应用程序可以共享的数据变得更加容易。

XML 简化数据传输
	通过 XML,可以在不兼容的系统之间轻松地交换数据。

	对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。

	由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。

XML 简化平台的变更
	升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。

	XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。

XML 使您的数据更有用
	由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。

	不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。

	通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

2、解析XML

1、SAX解析

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文件结束 -----");
}
}

2、DOM解析:适用于对节点进行操作

使用JDK提供的Dom解析工具
使用Dom4j解析

使用SAX解析XML文件

  •  优点:因为每次只读取其中一行内容,所以占用内存很小
    
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文件结束 -----");
	}
}

案例: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);
	}
}
	

案例: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());
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值