XML的概念与用途
XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML与HTML的比较
1.XML与HTML非常相似,都是编写标签
2.XML没有预定义标签,HTML存在大量预定义标签
3.XML重在保存和传输数据,HTML用于显示信息
XML的用途
1.java程序的配置描述文件
2.用于保存程序产生的数据
3.网络间的数据传输
XML文档结构
第一行必须是XML声明。
有且只有一个根节点。
XML标签的书写规则与HTML相同。
XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version=“1.0”encoding=“UTF-8”?>
第一个XML程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?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> <employee no="3310"> <name>李四</name> <age>31</age> <salary>3000</salary> <department> <dname>工程部</dname> <address>XX大厦-B104</address> </department> </employee> </hr>
|
XML标签书写规则
1 2 3 4 5 6 7 8 9 10 11 12
| 标签名使用小写英文, 单词间用-分隔 多级标签之间不要存在重名
对特殊符号使用实体引用或CDATA标签 5种实体引用 < < > > & & ' ' " " CDATA标签: <![CDATA[不希望由XML解析的文本数据]]>
|
XML语义约束之DTD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 1、XML文档结构正确,但可能不是有效的; 例如:员工档案XML中绝不允许出现“植物品种”标签。 XML语义约束就是用于规定XML文档中允许出现那些元素; 2、XML语义约束有两种定义方式:DTD与XML Schema; DTD:DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方法; DTD文件的扩展名为:.dtd; 例如:hr.dtd <!ELEMENT hr(employee+)> //大于1个 :定义了hr节点下只允许出现1个employee子节点。 <!ELEMENT employee(name,age,salary,department)> //employee节点下必须包含以下四个节点,且按顺序出现 <!ATTLIST employee no CDATA ""> <!ELEMENT name(#PCDATA)> // 定义name标签体只能是文本,#PCDATA代表文本元素; 3、DTD定义节点数量: 1)如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符; 如: <!ELEMENT hr(employee+)> //hr节点下最少出现1个employee子节点; <!ELEMENT hr(employee*)> //hr节点下可出现 0 或 n 个employee子节点; <!ELEMENT hr(employee?)> //hr节点下最多出现1个employee子节点; 4、XML引用DTD文件: 1)在XML中使用<!DOCTYPE>标签引用DTD文件。 SYSTEM 加载本地文件; 书写格式: <!DOCTYPE 根节点 SYSTEM "dtd文件路径"> 例如: <!DOCTYPE hr SYSTEM "hr.dtd">
|
创建DTD文件
1 2
| <!ELEMENT employee (name,age,salary,department):一定要注意employee ()之间有个空格,否则不生效。 <!ATTLIST employee no CDATA "">:来控制标签属性
|
XML Schema
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| XML Schema 比DTD更复杂 XML Schema提供了数据类型、格式限定、数据范围等特性 <schema xmlns="http://www.w3.org/2001/XMLSchema"> 声明文本是Schema <element>代表标签节点 <complexType>复杂节点, 标签包含子节点时使用 <sequence>子标签按顺序排列 <attribute>设置属性 标签属性: name= 属性名称 type= 属性值类型 use="required" 属性必须存在 minOccurs="" 最小出现次数 maxOccurs="" 最大出现次数 <simpleType>简单类型。 代替属性:type使用 <restriction>限定数据类型 base=""基本类型 <minInclusive value="">最小数据范围 <maxInclusive value="">最大数据范围 在XML文本的根节点添加xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schema文件路径" 属性来关联schema文本
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="hr"> <complexType> <sequence> <element name="employee" minOccurs="1" maxOccurs="9999"> <complexType> <sequence> <element name="name" type="string"></element> <element name="age"> <simpleType> <restriction base="integer"> <minInclusive value="18"></minInclusive> <maxInclusive value="60"></maxInclusive> </restriction> </simpleType> </element> <element name="salary" type="integer"></element> <element name="department"> <complexType> <sequence> <element name="dname" type="string"></element> <element name="address" type="string"></element> </sequence> </complexType> </element> </sequence> <attribute name="no" type="string" use="required"></attribute> </complexType> </element> </sequence> </complexType> </element> </schema>
|
DOM模型与Dom4j
1.将xml文件视为Document对象
2.将xml文件中的标签视为Element对象

Dom4j遍历XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.imooc.dom4j;
import java.util.List;
import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;
public class HrReader { public void readXml(){ String file = "d:/workspace/xml/src/hr.xml"; SAXReader reader = new SAXReader(); try { Document document = reader.read(file); Element root = document.getRootElement(); List<Element> employees = root.elements("employee"); for(Element employee : employees){ Element name = employee.element("name"); String empName = name.getText(); System.out.println(empName); System.out.println(employee.elementText("age")); System.out.println(employee.elementText("salary")); Element department = employee.element("department"); 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) { e.printStackTrace(); } } public static void main(String[] args) { HrReader reader = new HrReader(); reader.readXml(); } }
|
Dom4j更新XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package com.imooc.dom4j;
import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer;
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;
public class HrWriter { public void writeXml(){ String file = "d:/workspace/xml/src/hr.xml"; SAXReader reader = new SAXReader(); try { Document document = reader.read(file); 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"); Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8"); document.write(writer); writer.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { HrWriter hrWriter = new HrWriter(); hrWriter.writeXml(); } }
|
XPath表达式入门
