XML

五个方面

  1. XML介绍与用途
  2. XML的语法规则
  3. XML语义约束
  4. Java解析XML
  5. XPath路径表达式

XML介绍与用途

介绍

  1. 全称:EXtensible Markup Language

    ​ 可扩展 标记 语言

  2. 编写XML就是编写标签,与HTML非常类似,扩展名.xml

  3. 良好的人机可读性

    `<employee>
        <name>张三</name>
        <age>20</age>
        <height>1.80</height>
    </employee>

用途

  1. Java程序的配置描述文件(web.xml—web应用配置文件)
  2. 用于保存程序产生的数据
  3. 网络间的数据传输(webservice底层soap协议:)

语法规则(文档结构)

  1. 第一行必须是XML声明
  2. 有且只有一个根节点
  3. XML标 签的书写规则与HTML相同

XML声明

  • XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。

    <?xml version="1.0" encoding="UTF-8"?>

    version 代表版本号1.0 encoding UTF-8设置字符集,用于支持中文

XML标签书写规则

  1. 合法的标签名

    • 标签名要有意义
    • 建议使用英文,小写字母,单词之间使用 “ - “分割。
    • 建议多级标签之间不要存在重名情况
  2. 适当的注释与缩进

    适当的注释与缩进可以让XML文档更容易阅读

  3. 合理使用属性

    • 标签属性用于描述标签不可或缺的信息
    • 对标签分组或者为标签设置Id时常用属性表示
  4. 处理特殊字符

    • 标签体中,出现”<”、”>”特殊字符,会破坏文档结构。

      解决方案1:使用实体引用。

      XML支持五种实体引用

      实体引用 对应符号 说明
      &It; < 小于
      &gt; > 大于
      &amp; & 和号
      &apos; 单引号
      &quot; 双引号

      解决方案2:使用CDATA标签

      • CDATA指的是不应由XML解析器进行解析的文本数据
  5. 有序的子元素

    • 在XML多层嵌套的子元素中,标签前后顺序应保持一致
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<teaching-plan>
    <course>
        <course-name>大学英语</course-name>
        <class-hour>36</class-hour>
        <exam-form>考试</exam-form>
    </course>
    <course>
        <course-name>高等数学</course-name>
        <class-hour>70</class-hour>
        <exam-form>考试</exam-form>
    </course>
    <course>
        <course-name>计算机应用基础</course-name>
        <class-hour>108</class-hour>
        <exam-form>上机考试</exam-form>
    </course>
</teaching-plan>

XML语义约束

  • XML文档结构正确,但可能不有效。(如员工档案XML中出现“植物品种”)
  • XML予以约束有两种定义方式:DTD与XML Schema

DTD

DTD Document Type Definition 文档类型定义

  • DTD扩展名.dta
  • 利用DTD中的<!ELEMENT>标签,定义XML文档中允许出现的节点和数量,举例如下:
<!--定义hr节点下只允许出现一个employee子节点-->
<!ELEMENT hr (employee)>
<!--必须含有以下下四个节点,且按顺序出现-->
<!ELEMENT employee (name,age,salary,department)>
<!--定义name标签体只能是文本,#PCDATA代表文本元素>
<!ELEMENT name (#PCDATA)>
<!--最少出现1个-->
<!ELEMENT hr (employee+)>
<!--最多出现1个>
<!ELEMENT hr (employee?)>
<!--可出现0~n个-->
<!ELEMENT hr (employee*)>

XML怎么引用DTD文件?

回答:

格式:

<!DOCTYPE 根节点 SYSTEM "dtd文件路径">

示例:

<!DOCTYPE hr SYSTEM "hr.dtd">

DTD的创建和使用

  • 创建(idea):1.Tools

    ​ 2.XML Actions

    ​ 3.generate DTD from XML Files

  • 注意:父节点之后一定要有空格

XML Schema

  • XML Schema更复杂提供了更多功能
  • XML Schema提供了数据类型、格式限定、数据范围等特性。
  • XML Schema是W3C标准。(所以之后通常用XML Schema)
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="hr">
      <complexType>
        <sequence>
          <element name="employee">
            <complexType>
              <sequence>
                <element name="name" type="string"></element>
                <element name="age" type="integer">
                    <restriction base="integer">
                        <minInclusive value="18"><minInclusive>
                        <maxInclusive value="60"><maxInclusive>
                    </restriction>
                </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>
            </complexType>
          </element>
        </sequence>
      </complexType>
  </element>
</schema>

Tips:框架和架构都离不开schema

java解析XML

DOM文档对象模型

  • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。

Dom4j

  • Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点 。
  • Dom4j将XML视为Document对象
  • XML标签被Dom4j定义为Element对象

Dom4j遍历XML

package com.imooc.dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;
public class HrReader{
    public void readXml(){
        String file ="文件的路径";
        //SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式
        SAXReader reader=new SAXReader();
        try{
            Document document=reader.read(file);
            //获取XML的根节点
            Element root=document.getRootElement();
            //elements方法用于获取指定的标签集合
            List<Element> employees=root.elements("标签名(子节点名)");
            for(Element employee:employ){
                System.out.println(employee.elementText("name"));//获取name节点的文本内容
                Attribute att=employee.attribute("属性名");
                System.out.println(att.getText());
            }
        }
        catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        HrReader reader=new HrReader();
        reader.readXml();
    }
}

利用Dom4j更新XML

package com.imooc.dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class HrWriter {
    public void writeXml(){
        String file="C:\\Users\\Lenovo\\Desktop\\xml\\src\\haha.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("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实验室

  • 利用Dom4j开发”XPath实验室”,一起见证XPath的神奇之处

Jaxen介绍

  • Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM。
  • Dom4j底层依赖Jaxen实现XPath查询
  • 下载地址:jaxen.codehaus.org
package com.imooc.dom4j;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

public class XPathTestor {
    public void xpath(String xpathExp){
        String file="C:\\Users\\Lenovo\\Desktop\\xml\\src\\haha.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.attributeValue("no"));
                System.out.println(emp.elementText("name"));
                System.out.println(emp.elementText("age"));
                System.out.println(emp.elementText("salary"));
                System.out.println("=============================");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        XPathTestor testor=new XPathTestor();
        testor.xpath("/hr/employee");
        testor.xpath("//employee");
        testor.xpath("//employee[salary<4000]");
        testor.xpath("//employee[name='李铁柱']");
        testor.xpath("//employee[@no=3304]");
        testor.xpath("//employee[1]");
        testor.xpath("//employee[last()]");
        testor.xpath("employee[postion()<6]");
        testor.xpath("//employee[3]|//employee[8]");
    }
}

javaweb     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!