java心得(Xml)

一.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注意地方

1.xml文件一定要存在一个根节点, 且根节点只有一个  
2.xml文件的标签一定要正确的关闭  
3.属性节点 id="110"  
4.文本节点 zhangsan  
5.xml文件对大小写敏感 大小写表示的完全是不同的意思

七.解析过程
7.1用于XML文件DOM解析



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;
}

7.2Xml解析文件回写过程

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.3XML文件增删改查的方法

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文档,这个还是需要看下,加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值