XML
XML介绍
1、什么是xml?
概念:XML(EXtensible Markup Language)XML 指可扩展标记语言(EXtensible Markup Language)
可扩展:我们可以自定义,完全按照自己的规则来!
标记: 计算机所能认识的信息符号!
01.很像html
02.着重点是数据的保存
03.无需预编译
04.符合W3C标准
2、XML 命名规则
l 名称可以含字母、数字以及其他的字符
l 名称不能以数字或者标点符号开始
l 名称不能以字符 “xml”(或者 XML、Xml)开始
l 名称不能包含空格
3、XML的组成部分:
01.文档声明 <?xml version="1.0" encoding="UTF-8"?>
02.元素 <p></p>
03.属性 <p id="haha"></p>
04.注释 <!-- --> // /***/
05.特殊字符
06.CDATA区域 Character data 字符数据
CDATA区域: XML解析器不会处理,而是当成字符串原样输出!
<![CDATA[xml内容]]>
07.处理指令 引入css样式
4、XML 与 HTML 的主要差异
l XML 不是 HTML 的替代。
l XML 和 HTML 为不同的目的而设计:
l XML 被设计为传输和存储数据,其焦点是数据的内容。
l HTML 被设计用来显示数据,其焦点是数据的外观。
l HTML 旨在显示信息,而 XML 旨在传输信息。
5、XML注意点:
l xml文件中只能有一个根节点
l 节点要成对出现 有开发和闭合
l 节点必须正确的嵌套
l 严格区分大小写
l 空格和换行都是特殊字符 会被解析器解析
6、特殊字符:
> >
< <
& &
' '
" "
7、XML解析的四种方式
01.DOM:基于xml文档树结构的解析,把xml文件中的内容都读取到内存中,
比较占内存,消耗资源多!
02.SAX:基于事件的解析。消耗资源小!
03.JDOM:针对于java的特定模型!满足2 8原则!自身没有解析器,依赖于SAX2!
04.DOM4J:for(4)JDOM的一个分支!源码开放,性能优异,功能强大!
8、XMLDOM树
xml,html都是一个类似于倒挂的树!
只有一个根节点,枝叶茂盛!
我们把这个倒挂的树称之为===》dom树!
DOM:(Doucument Object Model)文档对象模型!
图示:
创建第一个maven项目:
步骤如下:
1.new project===>maven==>quick==>archetypeCatalog=internal
2.引入需要的pom节点
3.自定义一个xml文件
4.需求通过dom4j实现查询学校下面的年级以及班级信息
5.创建一个测试类 书写代码
DTD(Document Type Definition(文档定义类型))
l 01.规范我们的编码
l 02.在浏览器中正常的显示
实例:
<!ELEMENT school (grade+),(class|student)>
ELEMENT :元素,关键字
school:元素名称
grade:子元素或者元素类型 CDATA PCDATA (Parse)解析数据,不能包含子元素
字符的含义:
():用来给元素分组
| :两者必须选择一个
+ : 1-N,至少出现一次
* : 0-N,可有可无,并且可以多次
?: 0|1,最多一次
,:元素出现的顺序
DTD文档使用方式:
01.内部DTD
<!DOCTYPE 根元素[定义的内容]>
02.外部DTD
<!DOCTYPE 根元素 SYSTEM "dtd文件位置">
02.内外部DTD
<!DOCTYPE 根元素 SYSTEM "dtd文件位置"[定义的内容]>
XML课堂练习:(增 删 改 查)
步骤:
l 首先创建的是xml文件。(我的例子)
<?xml version="1.0" encoding="UTF-8"?>
<clothes>
<type name=" 衣服1">
<clothes name="连衣裙" color="白色"/>
<clothes name="T恤" color="蓝色"/>
</type>
<type name=" 衣服2">
<clothes name="牛仔裤" color="黑色"/>
<clothes name="夹克" color="粉色"/>
</type>
<type name=" 衣服3">
<clothes name="外套" color="蓝色"/>
<clothes name="短裤" color="灰色"/>
</type>
<type name="衣服4">
<clothes name="衬衫" color="白色"/>
<clothes name="紧身裤" color="黑色"/>
</type>
</clothes>
l 然后在测试类里边写相关的代码,来实现增删改查一系列操作
l 可以使用dom4j的相关架包信息 所以要在pom.xml文件里写上使用的dom4j信息,以便导dom4j的架包
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
l 初始的XML文件样式
查
要获取dom和根节点所以需要创建一个方法 ,以在查全部的时候调用 查询
1 //获取dom 和根节点 2 public static void getDocument() 3 { 4 SAXReader reader =new SAXReader();//创建解析器 5 try { 6 document =reader.read("src/resources/clothes.xml");//读取xml文件 7 root=document.getRootElement(); 8 } catch (DocumentException e) { 9 e.printStackTrace(); 10 } 11 }
1 //1.查看全部 2 private static void findAll() { 3 getDocument(); 4 //根据根节点获取子节点 5 Iterator <Element> types= root.elementIterator(); 6 while(types.hasNext()){ 7 Element type =types.next(); 8 System.out.println("衣服的名称"+type.attributeValue("name")); 9 //通过type获取clothes 10 Iterator<Element> clothes =type.elementIterator(); 11 //遍历clothes 12 while(clothes.hasNext()){ 13 Element cloth =clothes.next(); 14 System.out.println("衣服的款式为"+cloth.attributeValue("name")); 15 System.out.println("衣服的颜色为"+cloth.attributeValue("color")); 16 } 17 } 18 }
运行结果:
注意:
在写删 改 修的操作时 要考虑的是 ,我们不单单是对内存中修改,我们要的是需要在xml文件里修改 所以在完成这一系列的操作时我创建一个真正保存的方法
1 //真实的保存数据(字符流) 2 public static void save(){ 3 //创建输出流 4 XMLWriter writer=null; 5 //编码格式 6 OutputFormat format=null; 7 try { 8 format=OutputFormat.createPrettyPrint();//设置格式 9 writer =new XMLWriter(new FileWriter("src/resources/clothes.xml"),format); 10 writer.write(document); 11 } catch (IOException e) { 12 e.printStackTrace(); 13 }finally { 14 try { 15 writer.close(); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 } 20 }
增
1 //3.新增 2 private static void add() { 3 Element type =root.addElement("type"); 4 type.addAttribute("name","衣服4"); 5 Element cloth = type.addElement("clothes"); 6 cloth.addAttribute("name","衬衫"); 7 cloth.addAttribute("color","白色"); 8 Element cloth1 = type.addElement("clothes"); 9 cloth1.addAttribute("name","紧身裤"); 10 cloth1.addAttribute("color","黑色"); 11 save(); 12 System.out.println("新增成功"); 13 }
运行结果:
删
1 //2.删除 2 private static void delete() { 3 Iterator<Element> types =root.elementIterator();//拿到根节点下的所有的字节点 4 while(types.hasNext()){ 5 Element type =types.next(); 6 if (type.attributeValue("name").equals("衣服5")){ 7 root.remove(type); 8 } 9 } 10 save(); 11 System.out.println("删除成功"); 12 }
运行结果:
改
1 //4.修改 2 private static void update() { 3 Iterator<Element> types =root.elementIterator();//拿到所有的子节点 4 System.out.println("请输入需要修改的衣服名称"); 5 String Receive =input.next(); 6 System.out.println("请输入修改后的衣服名称"); 7 String Receive2 =input.next(); 8 while(types.hasNext()){ 9 Element type =types.next(); 10 if(type.attributeValue("name").equals(Receive)){ 11 type.setAttributeValue("name",Receive2); 12 } 13 } 14 save(); 15 System.out.println("修改成功"); 16 } 17 }