第二十三篇(XML)

XML

在前期的学习中的存储容器演变顺序为:变量 - > 数组 -> 对象 - > 对象数组 - >集合 - > 文件/IO流。 XML - > 数据库…

1.理解XML概念和优势

XML(eXtensible Markup Language)可扩展的标记语言,文件格式:.xml

它是一种很想HTML的标记语言。它的设计宗旨是传输数据,而不是显示数据。HTML中的元素是固定的,而XML标记没有被预定义,可以由用户来进行自定义,XML被设计为具有自我描述性,且跨平台。

目前采用1.0版本,W3C(万维网联盟 world wide web…)世界性的技术标准组织,给一系列的内容制定标准,包含着XML

eXtensible释义:可扩展的

Markup释义:标记

Language释义:语言

它的作用:

  1. 存储数据
  2. 数据传输格式
  3. 应用程序的配置文件
  4. AJAX的基石

2.会编写格式良好的XML文档

XML文档有两部分组成:
  1. 声明 放在XML文档的第一行,用来标注本文档的一个配置格式

    Version 采用的版本规范 encoding编码

  2. 主体的描述内容

    主体的描述内容有标签(元素/节点/标记)组成。

    一定有且仅有一个跟标签。

XML的标签

标签的语法:

<标签名	属性名="属性值"... >	标签能容	</标签名>

标签的分类:

<books></books>	双标签:有开放标签和闭合标签组成的,中间可以添加内容,标签内可以添加属性信息。

</books> 单标签/自闭和标签	只能添加一些属性信息

标签的规范视图:

在这里插入图片描述

3.了解XML中特殊字符的处理方式

有些时候我们确实需要在文件内存储一些符号,但是在XML中有些地方不允许出现< 、> 、‘ 、“ 、& 等符号,我们可以使用转义符来解决此问题。

  特殊符号	  对应单词	  对应转换字符
	&it;	(less than)		  <
	&gt;	(greater than)	  >
	&apos;	(apostrophe)	  '
	&quot;	(quotes)		  "
	&amp;	
					  &

注释:

<!-- 注释内容 -->

可以输入任意内容:

<![CDATA[ 无需考虑特殊符号的任意内容 ]]>

4.了解解析器和DOM树节点构造

在众多解析方法里,DOM是最基础的解析方式,它由W3C开发,并内置在Java类库中,API包地址为:org.w3c.com.***。

DOM是Document Object Model(文档对象模型)的意思。它的解析方式要求解析器把整个XML文档装载到内存(我们俗称DOM树),并解析成一个Document对象。

优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

缺点:XML文档过大,可能出现内存溢出问题。

DOM解析:

它会将XML内容加载到内存中生成对应的文档结构树(DOM树)。

在文档结构中,它是由一系列的节点构成的,节点有不同的类型,Node(节点)

例如:标签转换为了元素节点。

	  注释转换为了注释节点。

	  标签内容转换为了文本节点。

	  标签属性转换为了属性节点。

方法:

在这里插入图片描述
解析步骤:

在这里插入图片描述
DOM解析的展示代码

	private static Document document;
	
	/**
	 * 获得DOM树,获得Document对象
	 * @throws Exception 
	 */
	public static void getDom() throws Exception {
		// 1.获得解析器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.根据解析器工厂获得解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 3.解析器来解析XML文件
		document = builder.parse("src/user1.xml");
	}

5.会使用DOM操作XML数据

增加数据方法

为了添加XML内容 思路:

  1. 在内存中创建元素节点

  2. 给元素节点添加id属性

  3. 分别创建 元素节点 并且指定好内容

  4. 将三个元素节点添加到元素节点下

  5. 将元素节点添加到节点下

    public static void addXMLContent() throws Exception {
    	// 1. 在内存中创建<user>元素节点
    	Element userEle = document.createElement("user");
    	// 2. 给<user>元素节点添加id属性
    	userEle.setAttribute("name", "cxk");
    	// 3. 分别创建元素节点  并且指定好内容
    	Element userNameEle = document.createElement("Type");
    	userNameEle.setAttribute("name","userName: cxk");
    	Element pswEle = document.createElement("Type");
    	pswEle.setAttribute("name","password: cxknmsl");
    	Element emailEle = document.createElement("Type");
    	emailEle.setAttribute("name","email: cxk@126.com");
    	// 4. 将三个元素节点添加到<user>元素节点下
    	userEle.appendChild(userNameEle);
    	userEle.appendChild(pswEle);
    	userEle.appendChild(emailEle);
    	// 将userEle放到users中去
    	document.getElementsByTagName("users").item(0).appendChild(userEle);
    	// 调用持久化存储XML文件的方法
    	saveXML("src/user1.xml");
    }
    

删除数据方法

为了利用DOM将用户信息XML中的cxk记录删除思路

  1. 获取user元素(标签)

  2. 调用父级节点getParentNode().removeChild()方法删除

    public static void deleteEle() throws Exception {
    	// 1.获取所有的user
    	NodeList users = document.getElementsByTagName("user");
    	// 拿到所有节点
    	for(int i = 0; i < users.getLength(); i++) {
    		// 每一个节点
    		Node user = users.item(i);
    		// 强转类型(把节点类型转换成元素类型)
    		Element userEle = (Element)user;
    		// 如果元素属性是cxk
    		if(userEle.getAttribute("name").equals("cxk")) {
    			// 2.就调用父级节点getParentNode().removeChild()方法删除
    			userEle.getParentNode().removeChild(userEle);	
    		}
    	}
    	// 将修改过的文件持久化到本地XML文件
    	saveXML("src/user1.xml");
    }
    

修改数据方法

为了修改XML中liuyan的密码更改为654321 思路:

  1. 获取user元素(标签)

  2. 调用setAttribute()方法修改属性

    public static void updateEle() throws Exception {
    	// 1.获取所有的Type
    	NodeList Types = document.getElementsByTagName("Type");
    	// 拿到所有节点
    	for(int i = 0; i < Types.getLength(); i++) {
    		// 每一个节点
    		Node Type = Types.item(i);
    		// 强转类型(把节点类型转换成元素类型)
    		Element TypeEle = (Element)Type;
    		// 如果元素name属性是password: 123456
    		if(TypeEle.getAttribute("name").equals("password: 123456")) {
    			// 2.就调用setAttribute()方法修改为password: 654321
    			TypeEle.setAttribute("name", "password: 654321");
    		}
    		
    	}
    	// 将修改过的文件持久化到本地XML文件
    	saveXML("src/user1.xml");
    }
    

查询(显示)数据方法

为展示此XML的内容 思路:

  1. 获取所有的元素节点

  2. 遍历出每一个元素节点
    2.1 获取它的id属性值
    2.2 获取它的所有子元素节点
    2.3 遍历出每一个子元素,分别获取对应的元素内容

    public static void shouInfo() {
    		
    	// 1.获取所有的<user>元素节点
    	NodeList userNodeList = document.getElementsByTagName("user");
    	// 2.遍历出每一个<user>元素节点
    	for(int i = 0; i < userNodeList.getLength(); i++) {
    		// 每一个user元素节点
    		Node userNode = userNodeList.item(i);
    		// 2.1 获取它的name属性值
    		Element userEle = (Element)userNode;
    		String userName = userEle.getAttribute("name");
    		System.out.println(userName);
    		// 2.2 获取它的所有子元素节点 
    		NodeList types = userEle.getChildNodes();
    		// 2.3遍历出每一个子元素,分别获取对应的元素内容
    		for(int j = 0; j < types.getLength(); j++) {
    			// 拿到每一个子节点
    			Node typeNode = types.item(j);
    			// 如果当前节点是元素节点,才读取
    			if(typeNode.getNodeType() == Node.ELEMENT_NODE) {
    				// 转换类型
    				Element typeEle = (Element)typeNode;
    				System.out.println("\t"+typeEle.getAttribute("name"));
    			}
    		}
    		// 为了显示效果,输出一条分隔线
    		System.out.println("-------------------------------");
    	}
    }
    

持久化存储XML文件方法

/**
 * 将内存中DOM树持久化到本地XML文件
 * @param destXMLPath
 * @throws Exception 
 */
public static void transformDocument(String destXMLPath) throws Exception {
	// 1.创建转换器工厂对象
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	// 2.创建转换器对象
	Transformer transformer = transformerFactory.newTransformer();
	// 3.指定数据源和输出目的地
	Source xmlSource = new DOMSource(document);
	StreamResult outputTarget = new StreamResult(new File(destXMLPath));
	// 4.配置转换格式
	transformer.setOutputProperty("encoding", "UTF-8");
	// 5.转换器对象进行转换XML
	transformer.transform(xmlSource , outputTarget);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值