1 XML语法
1.1 XML用途
XML,(Extensible Markup Language)可扩展标记语言,独立于软件、硬件的信息传输工具,应用于web开发,常用于简化数据的存储、共享(传输)、跨平台(系统)、跨语言(各种语言都能用)。
【个人见解】:xml类似于正则表达式,不是sum公司的,是个独立的东西;
1.2 基本语法
1.2.1 XML指令
PI(processing instruction)处理指令,指挥解析引擎如何解析XML文档内容。
e.g
:<?xml version="1.0" encoding="utf-8" ?>---自动生成(永远在xml文档的第一行)
【个人见解】:
- 在XML中,所有的处理指令都是以<?开头,?>结尾,中间是处理指令的名称;
- PI要求必须指定一个version属性,可选standalone---是否允许使用外部xml文件声明(yes/no-默认)、encoding---指作者使用的字符编码格式(UTF-8、gb2312);
1.2.2 元素、属性
xml元素---从开始标签~结束标签的部分,元素可以包含其他元素、文本、或者两者混合物,元素也可以拥有属性。
<datasource id="db_orcale"> //dabasource--一个元素,其包含其他元素,例如property
<property name="url">
jdbc:thin@192.168.0.26:1521:tarena //property--一个元素,也可以包含元素、文本
</property>
<property name="dbUser">openlab</property> //元素也可以有属性,例如property具有name属性
<property name="url">open123</property>
</datasource>
属性(Attribute)---提供关于元素额外(附加)信息,通常这些信息不属于数据组成部分,但是对于处理这个元素得应用程序来说是很重要的。
【个人见解】:如果属性内部需要用到“ ”,则属性外部就要用‘ ’
1.2.3 大小写敏感
XML文档中对大小写很敏感,<Data>和<data>是不一样的,打开标签和关闭标签必须写成相同的,必须成对出现。
1.2.4 元素必须要有关闭标签
1.2.5 必须要有根元素(根元素只能有一个)
1.2.6 元素必须正确嵌套(开始标签、结束标签不能在不同元素之间交叉定义)
1.2.7 实体引用
实体---常用的短语、键盘字符、文件、数据库记录、任何包含数据的项。在XML中,有时实体内包含了一些字符,如& < > " ' 等,这些均是需要转义的,否则会被XML解析器生成错误。
xml常用实体引用
【个人见解】:实体还是可以自己声明的
1.2.8 CDATA段
格式:< ! [ CDATA [ 文本内容 ] ] >
2 XML解析方式
2.1 SAX解析方式
SAX(simple API for XML)解析,逐行扫描文档,一边扫描一边解析。
优点:解析可以立即开始,速度快、没有内存压力;
缺点:不能对节点进行修改;
2.2 DOM解析方式
DOM(Document Object Model)文档对象模型,解析过程中,先将文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
优点:将XMl文件在内存中构建树形结构,可以遍历、修改节点;
缺点:若文件较大,则会造成内存有压力,解析时间会比较长;
【个人见解】:相对于DOM,SAX可以在解析文档的任意时刻停止解析;另外,Android解析XML文件使用的是SAX。
3 读取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; //使用SAXReader需要导入dom4j-full.jar包,其是DOM4J类的一个核心API,用于读取XML文档
/*
* DOM4J是一个java的XML API,类似于JDOM,用于读写XML文件的。DOM4J是一个非常优秀的java XML API,是一个开源的软件
*/
/*
* 通过DOM来解析xml(不管怎么说也得读嘛,所以必须得通过SAXReader读)
*
* 解析xml文件的流程:
* 1、创建SAXReader,用于读取xml文件
* 2、指定xml文件使得SAXReader读取,并解析文档对象Document
* 3、获取根元素/根标签/根节点
* 4、获取每个元素,从而达到解析的目的(没有固定的写法)
*/
public class xmlDemo {
//要想解析xml文件,则必须读xml文件,即定义IO流,则必须用try-catch
public static void main(String[] args) {
try{
//1、创建SAXReader
SAXReader reader=new SAXReader(); //字符流(以Reader结尾,且xml文件里边存放的都是字符)
//2、读取指定xml文件
File xmlFile=new File("emp.xml");
/*
* 常用的读取方法:
* Document read(InputStream in) //字节输入流
* Document read(Reader read) //Reader-字符输入流 父类
* Document read(File file) //直接给定一个文件
*/
Document doc=reader.read(xmlFile);
/*
* read方法的作用:
* 1、读取给定的xml,并将其解析转换成一个Document对象
* 2、实际上这里已经完成了对整个xml解析的工作,并将所有的内容封装到一个Document对象中
* 3、Document对象可以描述当前xml文档
*/
/*
* Document对象是一颗文档树的根,为我们提供访问文档数据的最顶层的入口;
* 当我们得到Document对象后,就相当于得到整个XMl描述的树结构,接下来第一步就是,先获取根元素
*/
//3、获取根元素
Element root=doc.getRootElement(); //Document提供了一个方法Element getRootElement()获取根标签(一个Element对象)
/*
* Element类,Element-用于描述XML中的一个元素
*/
//4、获取下级元素(【注意】:只管向下一级)
//【补充知识点】:
/*
* Element类,提供了一系列方法:
* 1、Element element(String name);//获取当前元素下,第一个叫这个指定名字的子元素(还是一个Element对象)
* 2、List elements(); //获取当前元素下,所有的子元素(elements有很多重载方法)
* 3、List elements(String name); //获取当前元素下,所有同名(即都是叫指定的这个名字)的子元素
* 4、String getName(); //获取当前元素的名字
* 5、String getText(); //获取当前元素的文本节点(即开始、结束标签之间的文本)
* 6、String getTextTrim(); //在上边基础上,去除文本两端的空格
* 7、Attribute attribute(int index); //获取当前元素的指定属性,从0开始
* 8、Attribute attribute(String name); //获取当前元素的指定名字的属性
*/
List
elements=root.elements(); //返回所有子元素(Element对象)集合,
//这边返回的是每个emp元素,即该集合中保存的是多个emp元素,但是只是一个Element对象
/*
* 创建一个集合,用于保存xml中的每个用户的信息;
* 【1】先将用户信息取出;
* 【2】再创建一个Emp实例,将信息设置到该实例的对应属性上
* 【3】最终将所有的emp对象存入该集合中
*/
List
list=new ArrayList
();
/*
* 遍历出每一个emp元素(标签)
*/
for(Element emp:elements){ //从elements集合中,遍历数据存到emp变量中(emp是Element类型)
//解析emp标签
/*
* 【1】首先,获取当前emp标签下,名为name的子标签
* 【2】其次,获取前后标签中间的文本
*/
//获取名字
// Element ename=emp.element("name");
// String name=ename.getText();//确保当前标签的开始结束标签中间是文本
// String name=ename.getTextTrim();//将中间文本的两端空去掉
//或者:
/*
* String elementText(String name)
* 获取当前标签中,名为给定名字的子标签中间的文本。该方法与上边获取“name”的两句话等效
*/
String name=emp.elementText("name");
//获取年龄(由于上边方法返回的是String类型,所以这里需要将String类型转换为int类型)
String ageStr=emp.elementText("age");
int age=Integer.parseInt(ageStr);
String gendar=emp.elementText("gendar");
String doubleStr=emp.elementText("salary");
double salary=Double.parseDouble(doubleStr);
//创建Emp对象,用于保存信息
Emp e=new Emp();
e.setName(name);
e.setAge(age);
e.setGendar(gendar);
e.setSalary(salary);
/*
* 通过Element获取元素属性:
* 1、Attribute attribute(int index);//获取当前标签的第几个属性
* 2、Attribute attribute(String name);//获取当前标签的name属性
*/
/*
* Attribute类:(其每个实例,都描述了(某个元素的)某个 属性信息 )
* 【根据Attribute对象,通常我们会获取其对应的属性名、属性值】,具体方法:
* 1、String getName(); //获取属性的名字
* 2、String getValue(); //获取属性的值
*/
//获取id属性
Attribute attr=emp.attribute("id");
int id=Integer.parseInt(attr.getValue());
e.setId(id);
//将Emp对象存入集合
list.add(e);
}
System.out.println("解析了"+list.size()+"个员工信息");
//循环输出每个员工的信息
for(Emp e:list){
System.out.println(e);
}
}catch(Exception e){
}
}
}
4 写出XML
package XML;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
/*
* 使用DOM4J,可以自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写出到一个文件中
*/
/*
* 使用DOM写出一个XML
*
* 生成XML文件的基本步骤:
* 1、创建Document对象
* 2、为Document添加根节点
* 3、为根节点组建树状结构(根据具体需求,不一定需要)
* 4、Document构建好后,通过创建XMLWriter来输出
* 5、为XMLWriter指定写出目标路径
* 6、写出XML
*/
public class writeXML {
public static void main(String[] args) {
try{
//1、创建Document对象
/*
* DOM4J提供了一个类:DocumentHelper,
* 该类提供了一个静态方法:static Document createDocument()---用于创建Document对象
*/
Document doc=DocumentHelper.createDocument();
//2、添加根元素(由于之前了解知道。Element通常是用来描述XML中的一个元素的,所以我们要向Document对象添加一个Element,来表示根元素)
/*
* Document提供了一个方法:
* Element addElement(String name) //向Document中添加,指定名字的根元素
* 【1】:该方法只能调用一次,否则会抛出异常---“文档已存在根元素”
* 【2】:根元素添加完毕后,该方法返回---根元素所对应的Element对象,以便后续根据根元素组织整个树
*/
Element root=doc.addElement("list");
//3、向根元素中添加子元素
/*
* Element类提供一系列方法:(供应添加子元素、属性、文本等等)
* 1、Element addElement(String name) //向该元素添加子元素,返回其对应的element对象
* 【注意】这个方法可以调用多回(因为根元素下边可以有很多个子emp元素)
* 2、Element addText(String text) //向元素得文本节点,追加 文本信息
* 3、Element setText(String text) //向元素得文本节点,设置 文本信息
* 4、Element addAttribute(String name,String value) //给当前元素添加给定属性名字,以及对应的属性值(类似于StringBuilder的append方法)
* 【目的】:降低了连续添加元素时的代码复杂度
*/
//这里先自己手动创建一个集合,存放将要放入xml文件中的几个emp信息
List
list=new ArrayList
();
list.add(
new Emp(1,"霍霍",12,"男",3600.56));
list.add(
new Emp(2,"霍霍2",23,"女",2600.56));
list.add(
new Emp(3,"霍霍3",36,"男",8600.56));
list.add(
new Emp(4,"霍霍4",56,"女",15600.56));
list.add(
new Emp(5,"霍霍5",8,"男",10.56));
//添加完根元素后,循环(从设置的list中将每个emp)写出到给定的xml文件中
for(int i=0;i