一、为啥有xml文档
因为properties文件
只能表示 键值对,
不能表示 层级关系【日本--->京都】
二、xml文档 是怎样的
可扩展标记语言。
在此中,可 自定义标签【开始+结束】
标签包含关系=数据间关系
用以 配置参数
【如
c3p0-config.xml
DataSource ds=new ComboPoolelDataSource();
后者肯定通过某种方式 读取了前者中配置参数
拿到ds
】
三、组成部分【了解】
1)XML文档的声明:
<?xml version=”1.0” encoding=”utf-8” standalone=”yes” ?>
version=”1.0”:xml的版本(遵循的标准)
encoding=”utf-8”:编码
standalone=”yes”:是否是独立的xml文档,不需要其他外部的引用。
【默认是standalone="no"
可以有其他文档关联运行
如引入css文件】
2)元素:
自定义标签 = 元素,
标签 ———— 开始标签 、结束标签
3)属性:
在标签中的属性,比如:<成都 name=”cd”>
注意:元素和属性需要遵循以下命名规则:
区分大小写
不能以数字或者下划线开头
不能包含空格
不能以xml或者XML命名
名字中间不能使用冒号
4)注释:
<!-- 注释内容 -- >
5)数据区:
CDATA区
<![CDATA[
数据区的内容,在这里面,会把标签解析为普通的数据内容。
]]>
6)需转义的字符
& 转义为 :&
< 转义为 :<
> 转义为 :>
“ 转义为 :"
‘ 转义为 :'
7)执行命令 引入css文件
<?xml-stylesheet type=”text/css” href=”css文件” ?>
四、我们来创建1个xml文件:【卵用】
因为仅能有 1个根节点,
所以加 对address 包起。
同学写的:
<a> </a> = <a />
五、用Java代码 解析读取 xml文件中 内容 来 CRUD【重点】
1.我的xml结构:
属性 解析为 attribute
标签 解析为 element
标签中的内容 解析为 content
【扩展:dom4j 是xml文档的 开发包】
2.解析方式
2种 ———— dom、sax
dom
一次性 解析所有document 到 内存,
要哪个document对象 就从内存中 拿。
【占内存、利于CRUD=增删改查=效率高】
sax
要哪个document对象 就解析读取1次document
【不咋占内存、效率低=淘汰】
3.开始写吧
3.1 创建我的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><user>
<u1>
<username>张三</username>
<password>zhangsan</password>
<money>100.0</money>
</u1>
<u2>
<username>李四</username>
<password>lisi</password>
<money>50000.0</money>
</u2>
</user>
3.2 创建读xml的class
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
public class Readxml {
public static void main(String[] args) throws Exception {
//查
// myQuery();
//改
// myChange();
//增
// myAdd();
//改
mydel();
}
/**
* 查询 (xml文件中标签中 内容)
* 1. 解析出xml文件的 dom对象
* 2.通过dom对象 拿到指定节点
* 3.通过节点 拿到此中内容
*/
public static void myQuery() throws ParserConfigurationException, IOException, SAXException {
//DocumentBuilderFactory
// 定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器
//newInstance()
//获得一个新的一个 DocumentBuilderFactory实例。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//newDocumentBuilder()
//使用当前配置的参数创建一个新的DocumentBuilder实例。
//DocumentBuilder
//定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document 。
//这个类的一个实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获得。
// 一旦获得此类的实例,可以从各种输入源解析XML。
DocumentBuilder db = dbf.newDocumentBuilder();
//parse(File f)
//将给定文件的内容解析为XML文档,并返回一个新的DOM Document对象。
Document document = db.parse(new File("src\\main\\resources\\user.xml"));
//getElementsByTagName(String tagname)
// 以文件顺序返回 NodeList所有 Elements的给定标签名称,并包含在文档中。
//NodeList
// 只能装node 则不需要泛型
// 不是Collection下面的实现类
NodeList usernameList = document.getElementsByTagName("username");
//item(int index)
//返回 index中的index项=node
Node node = usernameList.item(0);
//getTextContent()
//返回此 节点 及其后代的 文本内容=String
String username = node.getTextContent();
System.out.println(username);//张三
}
/**
* 改
* 1.拿到dom对象
* 2.拿到节点
* 3.set更新此中内容[仅内存]
*
* 4.传给文件
*/
public static void myChange() throws ParserConfigurationException, IOException, SAXException, TransformerException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document adocument = db.parse(new File("src\\main\\resources\\user.xml"));
Node money = adocument.getElementsByTagName("money").item(1);
money.setTextContent("50000.0");
//Transformer可由TransformerFactory.newTransformer方法获得
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//transform(Source xmlSource, Result outputTarget)
//将XML Source转换为 Result=写出到指定xml文件
// 前者Source xmlSource 要写出的 在此方法中已修改的 document源————new DOMSource(document对象)
// 后者Result outputTarget 以此覆盖或新建整个xml文件————new StreamResult(new File(路径文件名
transformer.transform(new DOMSource(adocument),new StreamResult(new File("src\\main\\resources\\user.xml")));
}
/**
* 增(1对标签)
* 1.拿到dom对象
* 3.create1个标签 并加入内容
* 4.获取父节点 或 兄弟节点
* 5.append 或 before 到以上节点
*
* 6.传给文件
*
*/
public static void myAdd() throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("src\\main\\resources\\user.xml"));
Element food = document.createElement("food");
food.setTextContent("章鱼丸子");
//向 父标签 append
// document.getElementsByTagName("u1").item(0).appendChild(food);
//向 父标签内 兄弟标签 before
//既然如此 新加标签food放前者
document.getElementsByTagName("u1").item(0).insertBefore(food,document.getElementsByTagName("username").item(0));
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(new File("src\\main\\resources\\user.xml")));
}
/**
* 删除
* 1.拿到dom
* 2.拿到 要删除的节点
* 3.java中无自杀————通过此节点 拿到父节点removeChild
*/
public static void mydel() throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("src\\main\\resources\\user.xml"));
Node food = document.getElementsByTagName("food").item(0);
food.getParentNode().removeChild(food);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(new File("src\\main\\resources\\user.xml")));
}
}