XML简介:
XML(EXtensible Markup Language),可扩展标记语言
特点:
- XML与操作系统、编程语言的开发平台都无关【通用的数据交换格式】
- 实现不同系统之间的数据交换【包括系统的配置文件】
- 是一种标记语言,没有固定的标记,可以随便发明也可以自己创建
【整个XML是一种树形文件】
- 是其他技术的基础技术
作用:
- 数据交互
- 配置应用程序和网站
- Ajax基石
XML文档结构:
<?xml version="1.0" encoding="UTF-8"?> 【声明部分(位于第一行);这个是满足xml 1.0标准的】
【底下的都是:文档元素描述信息(文档结构),所有带尖括号的都叫标签,也叫元素,都是用树形文件写出来的】
<books> 【根元素,每个XML文件的根元素有且仅有一个】
<!--图书信息 --> 【XML中的注释语法:<!--……-->】
<book id="bk101"> 【books的子元素,包含关系的元素要用缩进来体现】
<author>王珊</author> 【book的子元素】
<title>.NET高级编程</title> 【就像以前的类和属性】
<description>包含C#框架和网络编程等</description>
</book>
<book id="bk102"> 【books的子元素】
<author>李明明</author>
<title>XML基础编程</title>
<description>包含XML基础概念和基本作用</description>
</book>
</books> 【根元素</……>是结束的符号】
【数据库,Java文件,XML文档应当全部一致】
XML文档内容由一系列标签元素组成
<元素名 属性名=“属性值”>元素内容</元素名>
空元素的方法:
<name>(这里是一个空格)</name>
<name></name>
<name/>
语法:
- 属性值用双引号包裹
- 一个元素可以有多个属性
- 属性值中不能直接包含<、“、&(不建议:‘、>)【最好都不要写】
例如:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<!-- 学生信息 -->
<student id="s1">
<name>张三</name>
<age>18</age>
</student>
<student id="s2">
<name>李四</name>
<age>22</age>
</student>
<!-- 这两种写法都可以,但是第一种用的居多 -->
<student id="s1"name="张三"age="18"/>
<student id="s2"name="李四"age="22"/>
</students>
XML编写注意事项:
- 所有XML元素都必须有结束标签(</……>)
- XML标签对大小写敏感
- XML必须正确的嵌套
- 同级标签以缩进对齐
- 元素名称可以包含字母、数字或其他的字符
- 元素名称不能以数字或者标点符号开始(<5name>是错误的;<name5>是正确的)
- 元素名称中不能含空格(<student name>是错误的;<studentname>是正确的的)
推荐的XML编写命名习惯:
- 编写的元素名称要有描述性。
- 名字尽量简短些,可以用下划线“_”,但是不要用中横线“-”、点“.”或者冒号“:”(<book_title>)。
- 数据库怎么命名,XML文件就怎么命名,要保持一致。
指出下面XML代码的错误:
<title><name>XML编程</title></name>
嵌套错误,应该是:
<title><name>XML编程</name></title>
XML中的转义符列表:
符号 | 转义符(预定义实体) |
< | < |
> | > |
" | " |
' | ' |
& | & |
当元素中出现很多特殊字符时,可以使用CDATA节,如:
<description><![CDATA[讲解了元素<title>以及</title>的使用]]>
等同于:
<description><讲解了元素<title>以及</title>的使用> </description>
XML命名空间(类似于Java中的包):
W3CSCHOOL中有XML的帮助文档;例如:http://www.w3school.com.cn/xml/xml_namespaces.asp
XML命名空间的作用
避免命名冲突
解决方法:
- 使用前缀来避免
例如:
此文档带有某个表格中的信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。
通过使用前缀,我们创建了两种不同类型的 <table> 元素。
- 使用命名空间(Namespaces)
例如:
这个 XML 文档携带着某个表格中的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
与仅仅使用前缀不同,我们为 <table> 标签添加了一个xmlns属性,里面的网址是统一资源标识符,目的是唯一标识一个命名空间,每一个统一资源标识符都是不一样的,但是没有实际意义,但是一般都能连到一个网页,取值这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
XML解析器:
- 非验证解析器【检查文档格式是否良好,不能验证是够有效】
- 验证解析器【使用DTD(Document Type Define是一种验证机制)检查文档的有效性】
解析XML技术:
DOM:
- 基于XML文档树结构的解析(解析成DOM树放内存里)
- 适用于多次访问的XML文档
特点:比较消耗资源
SAX:
- 基于事件的解析
- 适用于大数据量的XML文档
特点:占用资源少,内存消耗小
DOM4J(把DOM解析进行了一次封装,应用更多):
- 非常优秀的Java XML API
- 性能优异、功能强大
- 开放源代码
DOM解析XML:
DOM介绍
- 文档对象模型(Document Object Model)
- DOM把XML文档映射成一个倒挂的树
示例:
<book id=”1234”>
<title>三国演义</title>
<author>罗贯中</author>
<price>30元</price>
</book>
其中所有带尖括号的叫元素节点,只有文本文字的叫属性节点,id=”1234”叫做属性节点
变成:
更易于增删改查的应用
常用接口介绍:
DOM解析包:org.w3c.dom
常用接口 | 常用方法 | 说明 |
Document:表示整个 XML 文档 | NodeList getElementsByTagName(String Tag) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
Element createElement(String tagName) | 创建指定标记名称的元素 | |
Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素的所有子节点,返回节点集合 |
Element:XML 文档中的一个元素(是一种特殊的Node) | String getTagName() | 获取元素名称 |
DOM解析XML文件步骤:
- 创建解析器工厂对象
- 解析器工厂对象创建解析器对象
- 解析器对象指定XML文件创建Document对象
- 以Document对象为起点操作DOM树
DOM4J:
开源,易用,应用于Java平台上的一种解析XML的技术,提供第三方的jar包使用了大量的接口。
其中:
Document:定义XML文档(和DOM一样)
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性
第一步:拖进来jar包选择build path之后add build path,就会变成奶瓶。
然后再写开始初始化信息:
public Document parse(String url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
解析文件:
try {
parse("animals.xml");
} catch (DocumentException e) {
System.out.println("文件找不到");
}
对文件进行操作:
//先得到根节点
Element root=doc.getRootElement();
//遍历根元素的所有子节点
Iterator it= root.elementIterator();
while(it.hasNext()){
//得到每个user的所有子节点
Element user=(Element)it.next();
//其他操作
String XXX=user.getText();//得到子节点的文本
String XXX=user.attributeValue("id");//得到子节点的属性
user.addElement("name").addText(name);//给子节点添加文本
user.addAttribute("id", id);//添加属性
root.remove(user);//删除节点
}
总结:
主要内容:
- XML语言简介
- XML文档编写规范
- 什么是DOM解析XML
- DOM解析XML的方法
- DOM4J解析XML的方法