XML 简介
一.概念:Extensible Markup Language 可扩展标记语言
(1)可扩展:标签都是自定义的
(2)功能:存储数据。<1>配置文件 <2>在网络中传输
(3)xml和html的区别:
3.1、xml标签都是自定义的,html标签都是预定义的
3.2、xml语法严格,html语法松散。
3.3、xml是存储数据的,html是展示数据的。
(4)w3w:万维网联盟——xml的技术维护组织
二.语法:
1.基本语法
1.2 xml文档后缀名
1.3 xml第一行必须定义为文档声明
1.4 xml文档中仅有一个跟标签
1.5 属性指必须使用引号单双引度可以)
1.6 标签必须正确关闭
1.7 xml标签名称区分大小写
2.快速入门
<?xml version='1.0' ?>
<users>
<user id=1>
<name>zhangsan</name>
<age>12</age>
<gender>male</gender>
<br/>
</user>
<user id=2>
<name>lisi</name>
<age>21</age>
<gender>female</gender>
<br/>
</user>
</users>
3.组成部分:
1)文档声明:
1>格式:<?xml 属性列表?>
2>属性列表:
a.version:版本号,必须的
b.encoding:编码方式,告知解析引擎当前文档使用的字符集,默认ISO-8859-1
c:standalone:是否独立,yes:不依赖其他文件,no:依赖其他文件
2)指令:结合CSS的。
3)标签:标签名称自定义
1>名称可以包含字符、数字以及其他的字符
2>名称不能以数字或标点符号开始
3>名称不能以字母xml(或XML/Xml等)开始
4>名称不能包含空格
4)属性:id属性值唯一
5)文本;CDATA区:该区域中的数据会被原样展示,格式:<![CDATA[数据]]>
三、约束:规定xml文档的书写规则
1.作为框架的使用者(程序员)的掌握要求:
1)能够在xml中引入约束文档
2)能够简单的阅读约束文档
2.分类
1)DTD:一种简单的约束技术
2)Schema:一种复杂的约束技术
注意! 笔者本文用到了外部jar包:dom4j-2.0.0.jar
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件
XML的解析
XML解析:
SAX解析:逐行解析 缺点:不能增删操作。优点:快。 应用:移动端
DOM解析:整体文档解析。缺点:慢。优点:可以增删操作。应用:PC端
DOM4J解析XML文档的大致步骤:
1、创建SAXReader(注意:不要因为这个单词中有SAX就人为DOM4J是SAX解析,DOM4J是DOM解析,有这个名字的类而已)
2、使用SAXReader读取xml文档并生成Document对象。这一步也是DOM解析耗时耗资源的体现,因为要将XML文档全部读取
完毕,并存入到Document对象中。
3、通过Document获取根元素
4、按照文档的层级结构从根元素开始逐级获取子元素,已达到遍历XML文档数据的目的。
**本实例使用的是名为Emp的标准类,在文章末尾 **
package SE05.n1xml;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo02ParseXML {
public static void main(String[] args) {
List<Emp>list=new ArrayList<Emp>();//Emp是一个自己做的一个标准类
SAXReader reader=new SAXReader();//dom4j提供SAXReader
try {
Document doc=reader.read("D:\\Java\\ZhongXin\\src\\SE05\\n1xml\\xml\\emplist.xml");
/*
* Element的每一个实例用于表示xml文档中的一对标签,其提供了很多获取其表示的标签信息的方法;
* String getName();获取当前标签的名字
* String getText();获取当前标签中间的文本
* String elementText(String name);获取当前标签中指定名字的子标签中间的文本
* Element element(String);获取当前标签中指定名字的子标签
* List elements();获取当前标签的所有子标签
* List elements(String name);获取当前标签中指定的同名子标签
*
*/
// 根标签root:<list>....</list>
Element root=doc.getRootElement();
// 获取<list>标签中的所有<emp>标签
List<Element>empList=root.elements();
// 遍历empList集合,将每个<emp>标签中的员工信息解析出来,并以Emp实例的形式存入list集合
for(Element empEle:empList) {
System.out.println(empEle.getName());
// 获取名字
Element nameEle=empEle.element("name");
String name=nameEle.getText();
// 获取年龄
Element ageEle=empEle.element("age");
int age=Integer.parseInt(ageEle.getText());
// 获取性别
String gender=empEle.elementText("gender");
// 获取工资
int salary=Integer.parseInt(empEle.elementText("salary"));
// 获取id:Element有快捷的获取指定名字属性值的方法
int id=Integer.parseInt(empEle.attributeValue("id"));
Emp emp=new Emp(id,name,age,gender,salary);
list.add(emp);
}
System.out.println("解析完毕");
for(Emp e:list) {
System.out.println(e);
}
} catch (DocumentException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
生成XML文档
生成一个XML文档的大致步骤:
1、创建一个Document对象表示空白文档
2、向Document对象中添加根元素
3、按照预定生成的XML文档的结构依次从根元素开始逐级添加子元素
4、创建xmlWriter
5、通过xmlWriter将给定的Document对象写出以形成XML文档
package SE05.n1xml;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Demo03WriteXML {
public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
List<Emp>list=new ArrayList<Emp>();
list.add(new Emp(1,"张三",22,"男",5000));
list.add(new Emp(2,"李四",23,"男",5001));
list.add(new Emp(3,"王五",24,"男",5002));
list.add(new Emp(4,"赵六",25,"男",5003));
list.add(new Emp(5,"陈七",26,"男",5004));
list.add(new Emp(6,"王八",27,"男",5005));
// 1、创建一个Doucument对象表示空白文档
Document doc=DocumentHelper.createDocument();
// 2、Document提供了添加根元素的方法:
// Element addElement(String name);该方法只能调用一次
Element root=doc.addElement("list");
/*
* 将每个员工信息以<emp>标签形式添加到根标签中
*
* Element提供了向标签添加信息的相关方法:
* Element addElement(String name);向当前标签中添加指定名字的子标签,该方法可多次调用
* Element addText(String text);向当前标签中添加文本信息,返回的还是当前标签
* Element addAttribute(String name,String value);向当前标签中追加指定名字及对应值的属性
*/
for(Emp emp:list) {
// 向根标签中添加<emp>标签
Element empEle=root.addElement("emp");
// 添加<name>
Element nameEle=empEle.addElement("name");
nameEle.addText(emp.getName());
empEle.addElement("gender").addText(emp.getGender());
empEle.addElement("salary").addText(emp.getSalary()+"");
empEle.addAttribute("id", emp.getId()+"");
}
try {
XMLWriter writer =new XMLWriter(new FileOutputStream("D:\\Java\\ZhongXin\\src\\SE05\\n1xml\\xml\\emplist.xml"),OutputFormat.createCompactFormat());
writer.write(doc);
System.out.println("写出完毕");
writer.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
Emp类
package SE05.n1xml;
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 Emp() {
super();
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", 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;
}
}