一.xml和html的区别
我觉得记得xml主要是用于数据传输,而html主要是数据显示,也就是前端页面
二.xml的作用
2.1数据的载体,可是为什么都有数据库为什么还要XML,因为数据库主要保存的是持久性的数据,也就是不怎么需呀更改的数据,而比如气象的数据每天都在变化,所以保存在XML会更好,也就是xml保存比较经常变化的数据
2.2描述关系型的数据,也就是作为配置文件
2.2什么叫配置文件?刚开始我也不是很懂,后来查看项目代码发现比如我们用swing画界面图时候需要设置框架大小,也就是窗口大小,但是java代码里面出现常量数据是最不好的,因为维护性不高,所以把程序运行里面配置的窗口大小等写到配置文件,然后在创建一个窗口类通过读取配置文件来设置窗口类等属性,最后在程序中直接调用窗口类静态属性。这个文件就是配置文件
三.为什么有时候xml编码成中文乱码
首先需要知道Xml编码就是字符转换成字节的过程,而解码就是字节转换成字符的过程。而字节和字符的转换肯定和编码集有关,而Xml从内存编码进硬盘默认是gbk,而从硬盘解码到浏览器等工具默认是UTF-8,所以解码集都不同,肯定乱码。解决以上问题就是两边转换的编码集一致就行了,最方便方法就是Xml上写上这个
<?xml version="1.0" encoding="UTF-8" standalone="no"?><department>
四.XMl解析方式
我学了两种DOM解析和SAX解析
4.1这两个解析方式不同?
DOM解析优先是对文档CRUD方便,缺点占用内存大 Sax解析是占用内存小,解析速度快,缺点是只能查找,不适合增删改 因为dom是把整个文档数据封装成对象,一个g就封装成一个G
Sac是读一行执行一行,所以不能回头
五.XML解析工具
JAXP(官方给定)
JDOM
Dom4j(三大框架指定配置文件)我现在先学了JAXP
六.XML语法
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<department>
<Student id="120">
<name aa="bb">张三</name>
<age>20</age>
</Student>
<Student id="220">
<name>约德尔人</name>
<age>22</age>
</Student>
<Student id="330">
<name>玛丽</name>
<age>30</age>
</Student>
</department>
6.1每一个<>就是一个标签,而<department>是根标签
id="120"就是属性节点
<age>20</age>文本节点
6.2注意地方
public static Document getDocument(String filename)
throws ParserConfigurationException, SAXException, IOException {
// step1 创建文档加工工厂 ----单例模式
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// step2 通过文档加工工厂创建文档解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// step3 通过文档解析器获取文档对象
Document doc = builder.parse(filename);
return doc;
}
public static void outPutDoc(Document doc,String filename) throws FileNotFoundException, TransformerException{
DOMSource source = new DOMSource(doc);
// 流 确定目标的输出位置
StreamResult stream = new StreamResult(
new FileOutputStream(filename));
//需要把内存中的文档进行持久化
//传输加工工厂
TransformerFactory factory =
TransformerFactory.newInstance();
//创建传输解析器
Transformer transformer = factory.newTransformer();
//Source Result
transformer.transform(source, stream);
}
7.3.1查找
@Test
public void testAdd() throws ParserConfigurationException, SAXException, IOException, TransformerException {
// 一.插入元素
// 1.获取文档对象
Document doc = DOMUtils.getDocument("department.xml");
// 2.获取插入的位置元素
Node node = doc.getElementsByTagName("Student").item(0);
// 3.创建插入的元素
Node sex = doc.createElement("sex");
sex.setTextContent("男");
// 4.元素插入
node.appendChild(sex);
// 写回文档
DOMUtils.outPutDoc(doc, "department.xml");
// 二.插入属性
// 1.获取文档对象
Document doc1 = DOMUtils.getDocument("department.xml");
// 2.获取插入属性的元素(只有强转为element获取更加强大的功能,哈哈,子类功能比父类强大)
Element student = (Element) doc1.getElementsByTagName("Student").item(0);
// 3.插入属性
student.setAttribute("date", "2017-12-13");
// 4.写回文档
DOMUtils.outPutDoc(doc1, "department.xml");
}
7.3.2删除
@Test
public void testRemove() throws ParserConfigurationException, SAXException, IOException, TransformerException {
//删除元素
//获取文档对象
Document doc = DOMUtils.getDocument("department.xml");
//获取删除的元素
Node sex = doc.getElementsByTagName("sex").item(0);
//获得删除元素的父节点进行删除
sex.getParentNode().removeChild(sex);
//写回文档
DOMUtils.outPutDoc(doc, "department.xml");
//删除属性
//获取文档对象
Document doc1 = DOMUtils.getDocument("department.xml");
//获取删除属性的元素
Element date = (Element) doc1.getElementsByTagName("Student").item(0);
//删除属性
date.removeAttribute("date");
//写回文档
DOMUtils.outPutDoc(doc1, "department.xml");
}
7.3.3修改
@Test
public void testReplace() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//修改元素
//获取文档对象
Document doc = DOMUtils.getDocument("department.xml");
//获取修改的元素
Node age = doc.getElementsByTagName("age").item(0);
//修改元素
age.setTextContent("20");
//写回文档
DOMUtils.outPutDoc(doc, "department.xml");
//修改属性
//获取文档对象
Document doc1 =DOMUtils.getDocument("department.xml");
//获取修改属性的元素
Element student = (Element) doc1.getElementsByTagName("Student").item(0);
//修改属性
student.setAttribute("id", "120");
//写回文档
DOMUtils.outPutDoc(doc1, "department.xml");
}
7.3.4 查询
@Test
public void testVisit() throws ParserConfigurationException, SAXException, IOException{
//查找元素
//获取文档对象
Document doc = DOMUtils.getDocument("department.xml");
//获取查找的元素
Node name = doc.getElementsByTagName("name").item(0);
//查看元素
System.out.println(name.getTextContent());
//查看属性
//获取文档对象
Document doc1 = DOMUtils.getDocument("department.xml");
//获取查看属性的元素
Element name1 = (Element) doc1.getElementsByTagName("name").item(0);
//获取属性集合
NamedNodeMap nnm = name1.getAttributes();
//查看属性
System.out.println(nnm.item(0).getNodeName()+"----"+nnm.item(0).getNodeValue());
}
7.3.5总结(动刀就是增删改查)
刚开始学习时候很蒙,因为出现很多类也出现很多方法,所以很混乱,后来自己总结下增删改差
1.获得文档对象
2.获得需要动刀的节点
3.怎么动刀
4.回写操作一定要回写操作,(因为动刀只是在你的内存动刀,而你硬盘的XML文件并没有改变,所以需要回写去和他说我修改你了才是真正动刀)
其中对元素动刀和对属性动刀大同小邑,只是对元素动刀直接获得对应的Node,而对属性动刀需要转换为Element,(学这个记住两点1.element或者text或者attr都是Node的子类2.子类方法一定比父类多,因为对属性更深一步动刀,所以需要用到子类更强大功能)
7.4心得
我查询下XML现在很多领域都被其他东西替代,比如json,我觉得先从一门入手学好,其他再慢慢来,还有XML有DTD文档,DTD文档也就是校验,因为你的XML文档肯定是不能乱写,需要一定的约束,所以就出现DTD文档,这个还是需要看下,加油