整体介绍
◆XML介绍与用途 ◆XML的语法规则 ◆XML语义约束 ◆Java解析XML ◆XPath路径表达式
XML的概念与用途
XML的全称是EXtensible Markup Language,可扩展标记语言 编写XML就是编写标签,与HTML非常类似,扩展名.xml 良好的人机可读性
XML与HTML的比较
◆XML与HTML非常相似,都是编写标签 ◆XML没有预定义标签,HTML存在大量预定义标签 ◆XML重在保存与传输数据,HTML用于显示信息
XML的用途
◆Java程序的配置描述文件。
◆用于保存程序的产生的数据。
◆网络间的数据传输。
XML的文档结构
◆第一行必须是XML声明。 ◆有且只有一个根节点。 ◆XML标签的书写规则与HTML相同。
XML声明
◆XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0"encoding="UTF-8"?>
<!-人力资源管理系统->
<hr>
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
</hr>
通过浏览器检测语法是否出现问题
XML标签书写规则
◆合法的标签名 ◆适当的注释与缩进 ◆合理使用属性 ◆特殊字符与CDATA标签 ◆有序的子元素
合法的标签名
◆标签名要有意义。 ◆建议使用英文,小写字母,单词之间使用“-”分割。 ◆建议多级标签之间不要存在重名的情况。
适当的注释与缩进
◆适当的注释与缩进可以让XML文档更容易阅读。
合理使用属性
◆标签属性用于描述标签不可或缺的信息。 ◆对标签分组或者为标签设置id时常用属性表示。
处理特殊字符
◆标签体中,出现”<”、”>“特殊字符,会破坏文档结构。
◆解决方案1:使用实体引用。 ◆解决方案2:使用CDATA标签。
XML支持五种实体引用
CDATA标签
◆CDATA指的是不应由XML解析器进行解析的文本数据 ◆从”<[CDATA[“开始,到”]]>“结束
有序的子元素
◆在XML多层嵌套的子元素中,标签前后顺序应保持一致。
XML的语义约束
◆XML文档结构正确,但可能不是有效的。 ■例如,员工档案XML中绝不允许出现”植物品种”标签。XML语义约束就是用于规定XML文档中允许出现哪些元素。 ◆XML语义约束有两种定义方式:DTD与XML Schema。
Document Type Definition
◆DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式。 ◆DTD文件的扩展名为.dtd。
<!ATTLIST employee no CDATA "">表示哪些属性可以出现
DTD定义节点
◆利用DTD中的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以hr.xml为例:
DTD定义节点数量
◆如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
XML引用DTD文件
◆在XML中使用<!DOCTYPE>标签来引用DTD文件。
创建DTD文件
DTD本质上也是一份XML文件,以<?xml开头 XML中标签出现顺序必须匹配DTD文件中定义的
XML Schema
◆XML Schema比DTD更为复杂,提供了更多功能。 ◆XML Schema提供了数据类型、格式限定、数据范围等特性。 ◆XML Schema是W3C标准。
两个文件 hr-schema.xml和hr.xsd文件
<?xml version="1.0"encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!-complexType标签含义是复杂节点,包含子节点时必须使用这个标签->
<complexType>
<sequence>
<element name="employee">
<!- 继续书写子节点->
</element>
</sequence>
</complexType>
</element>
</schema>
所有文件都以,xsd后缀结尾 1.声明根节点 2.复杂节点包含子节点需要下面骨架
<complexType>
<sequence>
<element name="employee">
<!- 继续书写子节点->
</element>
</sequence>
</complexType>
3.节点名称若是纯文本,加上type值,如type=“string” 代表只允许输入字符串,不能拥有子节点 高级之处拥有了数据类型 department下有名字dname和住址address,所以继续书写子节点骨架
4.在xml文件中对xsd文件进行导入绑定引用
添加语句:
<hr xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“hr.xsd”> xsi:noNamespaceSchemaLocation=“hr.xsd”表示指明文件名
5.次数出现设置 至少一次,最多9999次
<element name="empLoyee" minoccurs="1" maxoccurs="9999">
6.属性值添加 属性值相当于html里的选择器名
7..限制工作年龄18-60,修改上面age限制
<element name="age">
<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
Java解析xml
DOM模型与Dom4j
DOM文档对象模型
DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。
Dom4j
Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点。
◆Dom4j将XML视为Document对象。 ◆XML标签被Dom4j定义为Element对象。
利用Dom4j遍历XML
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.Element;
public class HrReader{
public void readXml(){
String file = "d:/workspace/xml/src/hr.xml";
//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中
SAXReader reader = new SAXReader();
try{
Document document = reader.read(file);
//获取XML文档的根节点,即hr标签
Element root = document.getRootElement();
//elements方法用于获取指定的标签集合
List<Element>employees = root.elements("employee");
for(Element employee : employees){
//element方法用于获取唯一的子节点对象
Element name employee.element("name");
String empName=name.getText();//getText()方法用于获取标签文本
System.out.println(empName);
//这一句相当于上面三句
System.out.println(employee.elementText("name"));
System.out.println(department.element("dname").getText());
System.out.println(department.element("address").getText());
//返回属性
Attribute att = employee.attribute("no");
System.out.println(att.getText());
}
}catch (DocumentException e){
//TODO Auto-generated catch block
e.printstackTrace();
}
}
public static void main(String[] args){
HrReader reader = new HrReader();
reader.readxml();
}
利用Dom4j更新XML
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.Element;
public class HrWriter {
public void writeXml(){
String file = "d:/workspace/xml/src/hr.xml";
//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中
SAXReader reader = new SAXReader();
try{
Document document = reader.read(file);
//获取XML文档的根节点,即hr标签
Element root = document.getRootElement();
//写入
Element employee = root.addElement("employee");
//添加属性值
employee.addAttribute("no","3311");
Element name = employee.addElement("name");
name.setText("李铁柱");
//下面这句相当于上面两句写法的简写
employee.addElement("age").setText("37");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname'").setText("人事部");
department.addElement("address").setText("XX-B105");
//上面只写到内存,要写回xml文件 UTF-8很重要,否则乱码
Writer writer = new OutputstreamWriter(new FileOutputstream(file) , "UTF-8");
document.write(writer);
writer.close();
}catch (Exception e){
//TODO Auto-generated catch block
e.printstackTrace();
}
}
public static void main(String[] args){
HrWriter hrWriter = new HrWriter();
hrWriter.writeXml();
}
XPath路径表达式
◆XPath路径表达式是XML文档中查找数据的语言。 ◆掌握XPath可以极大的提高在提取数据时的开发效率。 ◆学习XPath本质就是掌握各种形式表达式的使用技巧。
◆最常用的基本表达式
XPath谓语表达式
实验
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class XPathTestor{
public void xpath(String xpathExp){
String file = "d:/workspace/xml/src/hr.xml";
SAXReader reader = new SAXReader();
try{
Document document reader.read(file);
List<Node>nodes = document.selectNodes(xpathExp);
for(Node node nodes){
Element emp = (Element)node;
System.out.println(emp.elementText("name"));
System.out.println(emp.elementText("age"));
System.out.println(emp.elementText("salary"));
}
}catch (DocumentException e){
//TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
XPathTestor testor = new XPathTestor();
testor.xpath("/hr/employee");
}