目录
XML:
概述:
XML指可扩展标记语言( EXtensible Markup Language ), 是独立于软件和硬件的信息传输工具,XML应用于web开发的许多方面,常用于简化数据的存储和共享。
用途:
XML简化数据共享
XML简化数据传输
XML简化平台的变更
XML语法
XML处理指令:
XML处理指令,简称PI ( processing instruction ) .处理指令用来指挥解析引|擎如何解析XML文档内容。
< ?xm| version= "1.0" encoding= "utf-8" ?>
-在XML中,所有的处理指令都以<?开始,?>结束。<?后面紧跟的是处理指令的名称。XML 处理指令要求指定一个version属性。并允许指定可选的standalone和encoding ,其中standalone是指是否允许使用外部声明,可设置为yes或no。yes是指定不使用外部声明。no为使用。encoding是指作者使用的字符编码格式。有UTF- 8,GBK,gb2312等等。
元索和属性:
XML文档包含XML元素。XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者
的混合物。元素也可以拥有属性。
XML元素可以在开始标签中包含属性, 属性(Attribute)提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对需要处理这个元素的应用程序来说却很重要。XML属性必须加引号, 属性值必须被引号包围,不过单引号和双引号均可使用。如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体弓|用。
<?xml version="1.0" encoding="UTF-8"?>
<!--
XML 可扩展标记语言
XML元素(Element):一个元素就是一对标签,格式<name></name>.开始与结束标签名字要一致,
大小写一致。
元素中可以添加属性,属性只能定义在开始标签中,格式为:name="value",多个属性
之间用空格隔开。
元素中也可以包含子元素或文本(一对标签中可以包含子标签或文本信息)
例如:
<emp id="1" name="张三">
<a>你好</a>
<a>谢谢</a>
<b>再见</b>
</emp>
XML文档有一个要求,只能有一个根元素,根元素就是不被其他元素包含的元素。
XML文档要求元素必须成对定义,但是可以有省略结束标签的写法:
通常写法:
<a id="value" ></a>
省略结束标签的写法:(一般一个元素中不再包含子元素或文本时可以用省略结束标签写法)
<a id="value" />
当在XML中使用了XML关键字符时,若想表示它原本的含义时要使用实体引用
<a>1<2</a> 语法错误,认为1<2中的"<"是标签的开始
< : <
> : >
' : '
" : "
& : &
例如:<a>1<2</a>应当写成<a>1<2</a>
-->
大小写敏感:
XML对大小写是敏感的,这点不象HTML。 在XML中标记< Letter>和标记< letter>是不一样的。因此,起始和结束标记的大小写应该写成相同的:
<letter> ... </letter>
< Letter>... </Letter>
元索必须有关闭标签:
XML要求每个元素必须由起始标签和关闭标签组成。关闭标签与起始标签的名字相同,写法上多一个"/"
<Letter><!--只有 起始标记是不行的。-->
<Letter> </Letter><!--必须要有关闭标签-->
<Letter /><!--自关闭标签等同于无内容空元素-->
必须有根元素:
XML要求必须有根元素, 所谓根元素就是不被其它元素包围。并且根元素只能有一个。
<datasourceid= "db_ oracle''><!--根元素 -->
<property name= "url">
jdbc:thin@192.168.0.26:1 521:tarena
</property>
<property name=”dbUser" > openlab </property>
< property name=”dbPwd" > open123 </property>
</datasource>
<!--这里不能再定义与datasource平级的元素!-->
元素必须正确嵌套:
XML要求所有元素必须正确的嵌套。
<datasourceid= "db_ oracle" >
<property name=”dbPwd"> open123
</datasource><!--这里嵌套关系出现了错误-->
</property>
实体引用:
实体可以是常用的短语,键盘字符,文件,数据库记录或任何包含数据的项。在XML中,有时实体内包含一-些字符,如& 、<、>
等。这些均需要对其进行转义,否则会对XML解释器生成错误。
实体引用 | 字符 | 说明 |
< | < | 小于 |
> | > | 大于 |
& | & | 与字符(和字符) |
' | ' | 单引号 |
" | " | 双引号 |
CDATA段:
格式: <! [CDATA [文本内容]] >特殊标签中的实体引|用都被忽略,所有内容被当成一整块文本数据对待
< ?xml version= "1.0" encoding= "utf-8" ?>
< root>
<![CDATA[
<hello>
<!-- 无论这里写什么,都会被当做一个文本-->
<world>
]]>
< subRoot> </subRoot>
</root>
XML解析:
XML解析方式:
SAX解析方式:
SAX ( simple API for XML )是一种XML解析的替代方法。相比于DOM , SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM ,SAX可以在解析文档的任意时刻停止解析。
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对节点做修改
DOM解析方式:
DOM : (Document Object Model,即文档对象模型)是W3C组织推荐的处理XML的一-种方式。DOM解析器在解析XML文档时,会把文档中的所有元素按照其出现的层次关系,解析成一个个Node对象(节 点)。
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点:如果文件比较大,内存有压力,解析的时间会比较长
读取XML:
SAXReader读取XML文档:
使用SAXReader需要导入dom4j fulljar包。dom4j是一个Java的XML API ,类似于jdom ,用来读写XML文件的。dom4j是 个非常优秀的Java XML API具有性能优异、功能强大和易用的特点,同时它也是个开放源代码的软件。创建SAXReader来读取XML文档。
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./emplist.xml"));
Document方法:
Document对象是棵文档树的根 ,可为我们提供对文档数据的最初(或最顶层)的访问入口。Element对象表示XML文档中的元素。
元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。
Document的getRootElement方法:
Element getRootElement(用于获取根元素。
Element 方法:
Element element(String name);获取当前元素下的指定名字的子元素
List elements( );获取当前元素下的所有子元素
getName的方法:
String getName( )获取当前元素的元素名
getText方法:
String getText()
获取当前元素的文本节点(起始标记与结束标记之间的文本)
elementText方法是获取当前标签下指定名字子标签中间的文本
attribute方法
-Attribute attribute(int index)
获取当前元素的指定属性, index为索引,从0开始。
Attribute attribute(String name)
获取当前元素的指定名字的属性。
Attribute 方法:
Attribute对象用于描述一个元素中的某个属性信息。
根据该对象可以获取属性名和属性值等信息
- String getName() :获取属性的名字
String getValue() :获取属性的值
XML解析练习:
package xml;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 解析XML
* XML解析有两种方式:SAX,DOM
* SAX:simple api for xml,解析XML的简单API,特点是内存占用少,速度快,但由于是逐行
* 扫描形式解析,对整体结构没有把控,不能修改XML内容。
*
* DOM:document object model,文档对象模型。特点是解析XML时会将XML结构内建成一颗树
* 然后通过遍历树的形式解析xml内容,由于对整体结构有把控,可以修改XML内容。但是由于
* 会内建整棵树,因此内存占用多,速度慢。
*
* W3C推荐的解析形式为DOM
*
*/
public class ParseXmlDemo {
public static void main(String[] args) {
/*
* 使用dom解析XML的大致步骤
* 1:创建SAXReader
* 2:使用SAXReader读取XML文档并生成Document对象(内建树的过程)
* 3:通过Document对象获取根元素
* 4:通过根元素开始按照XML的结构逐级获取子元素以达到遍历XML的目的
*/
try {
//1
SAXReader reader = new SAXReader();
//2
Document doc = reader.read(new File("./emplist.xml"));
/*
* 3 获取根元素
* Element 类的每一个实例用于表示XML文档中的一个元素(一对标签)
* 通过Element可以获取其表示的这对标签的相关信息,常用操作有:
*
* String getName()
* 获取当前标签的名字
*
* String getText()
* 获取当前标签中间的文本
*
* Element element(String name)
* 获取当前标签下指定名字的子标签
*
* List elements()
* 获取当前标签下所有子标签
*
* List elements(String name)
* 获取当前标签下所有同名子标签(指定的名字)
*
*/
//<list>标签
Element root = doc.getRootElement();
System.out.println(root.getName());//输出根标签的名字
/*
* 将emplist.xml文件中的所有员工信息读取出来并存入一个集合
*/
List<Emp> empList = new ArrayList<>();
//从<list>标签下获取所有<emp>标签
List<Element> list = root.elements("emp");
System.out.println(list.size());
//遍历每一个<emp>标签
for(Element empEle : list) {
//获取该员工的名字
//1先获取<emp>标签下名为<name>的子标签
Element nameEle = empEle.element("name");
//2获取<name>标签中间的文本
String name = nameEle.getTextTrim();
//获取年龄
int age = Integer.parseInt(
// empEle.element("age").getTextTrim()
//elementText方法是获取当前标签下指定名字子标签中间的文本
empEle.elementTextTrim("age")//等同上面一句的代码
);
//获取性别
String gender = empEle.elementText("gender");
//获取工资
int salary = Integer.parseInt(
empEle.elementText("salary")
);
//获取<emp>标签中的属性id的值
// Attribute attr = empEle.attribute("id");
// int id = Integer.parseInt(
// attr.getValue()
// );
// int id = Integer.parseInt(
// empEle.attribute("id").getValue()
// );
//attributeValue方法用来获取当前标签下指定名字的属性对应的值
int id = Integer.parseInt(
empEle.attributeValue("id")
);
Emp emp = new Emp(id, name, age, gender, salary);
empList.add(emp);
}
System.out.println("解析完毕");
for(Emp e : empList) {
System.out.println(e);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package xml;
/**
* 员工类,每一个实例表示xml文档中的一个员工信息
*/
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private int salary;
public Emp(int id, String name, int age, String gender, int salary) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String toString() {
return id+","+name+","+age+","+gender+","+salary;
}
}