整体介绍

◆XML介绍与用途 ◆XML的语法规则 ◆XML语义约束 ◆Java解析XML ◆XPath路径表达式

XML系列教程 (w3school.com.cn)

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");
}