XML
在前期的学习中的存储容器演变顺序为:变量 - > 数组 -> 对象 - > 对象数组 - >集合 - > 文件/IO流。 XML - > 数据库…
1.理解XML概念和优势
XML(eXtensible Markup Language)可扩展的标记语言,文件格式:.xml
它是一种很想HTML的标记语言。它的设计宗旨是传输数据,而不是显示数据。HTML中的元素是固定的,而XML标记没有被预定义,可以由用户来进行自定义,XML被设计为具有自我描述性,且跨平台。
目前采用1.0版本,W3C(万维网联盟 world wide web…)世界性的技术标准组织,给一系列的内容制定标准,包含着XML
eXtensible释义:可扩展的
Markup释义:标记
Language释义:语言
它的作用:
- 存储数据
- 数据传输格式
- 应用程序的配置文件
- AJAX的基石
2.会编写格式良好的XML文档
XML文档有两部分组成:
-
声明 放在XML文档的第一行,用来标注本文档的一个配置格式
Version 采用的版本规范 encoding编码
-
主体的描述内容
主体的描述内容有标签(元素/节点/标记)组成。
一定有且仅有一个跟标签。
XML的标签
标签的语法:
<标签名 属性名="属性值"... > 标签能容 </标签名>
标签的分类:
<books></books> 双标签:有开放标签和闭合标签组成的,中间可以添加内容,标签内可以添加属性信息。
</books> 单标签/自闭和标签 只能添加一些属性信息
标签的规范视图:
3.了解XML中特殊字符的处理方式
有些时候我们确实需要在文件内存储一些符号,但是在XML中有些地方不允许出现< 、> 、‘ 、“ 、& 等符号,我们可以使用转义符来解决此问题。
特殊符号 对应单词 对应转换字符
⁢ (less than) <
> (greater than) >
' (apostrophe) '
" (quotes) "
&
&
注释:
<!-- 注释内容 -->
可以输入任意内容:
<![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内容 思路:
-
在内存中创建元素节点
-
给元素节点添加id属性
-
分别创建 元素节点 并且指定好内容
-
将三个元素节点添加到元素节点下
-
将元素节点添加到节点下
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记录删除思路
-
获取user元素(标签)
-
调用父级节点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 思路:
-
获取user元素(标签)
-
调用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的内容 思路:
-
获取所有的元素节点
-
遍历出每一个元素节点
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);
}