javaweb入门(一) ---- XML

XML是什么?

XML的全称是EXtensible Markup Language (可扩展标记语言)。
编写XML就是编写标签,与HTML非常类似,扩展名为.xml
如:

// demo.xml
<employee>
    <name>李思</name>
    <age>18</age>
    <height>170</height>
</employee>

XML VS HTML

  • 二者非常相似,都是编写标签。
  • XML没有预定义标签,HTML存在大量的预定义标签。
  • XML重在保存和传输数据,而HTML用于显示信息。

XML的用途

  • 配置文件。
  • 保存程序产生的数据。
  • 网络间的数据传输。

XML文档结构

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

XML声明

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

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<!-- 注释的写法 -->
<company>
    <employee>
        <name no="210">李思</name>
        <age>18</age>
        <department>
            <dname>研发部</dname>
            <address>西溪八方城</address>
        </department>
    </employee>
    <employee>
        <name no="210">王五</name>
        <age>20</age>
        <department>
            <dname>设计部</dname>
            <address>阿里事业部</address>
        </department>
    </employee>
</company>

在浏览器中可打开查看:

XML声明在这里插入图片描述

XML标签书写规则

  1. 合法的标签名
    标签名要有意义。
    建议使用英文,小写字母,单词之间使用-分割
    建议多级标签之间不要存在重名的情况。
    在这里插入图片描述

  2. 适当的注释与缩进
    可以让XML更容易阅读。
    在这里插入图片描述
    在这里插入图片描述

  3. 合理使用属性
    标签属性用于描述标签不可或缺的信息。
    对标签分组或者为标签设置id时常用属性表示。
    合理使用属性

  4. 特殊字符与CDATA标签
    标签体中,出现 < >这样的字符,会破坏文档结构。
    在这里插入图片描述
    解决方法1:使用实体引用
    适合特殊符号比较少的情况。
    在这里插入图片描述
    在这里插入图片描述
    解决方法2:使用CDATA标签
    CDATA指的是不应由XML解析器进行解析的文本数据。
    从 <![CDATA[ 开始,到 ]]> 结束
    在这里插入图片描述
    使用CDATA标签
    在这里插入图片描述

  5. 有序的子元素

在XML多层嵌套的子元素中,标签前后顺序应保持一致。
在这里插入图片描述

XML语义约束

XML文档结构正确,但可能不是有效的。
例如:员工档案XML中绝不允许出现“植物品种”标签。XML语义约束就是用于规定XML文档中允许出现哪些元素。
XML语义约束有两种定义方式:DTD与XML Schema。

DTD( Document Type Definition)

DTD(文档类型定义)是一种简单易用的语义约束方式。
DTD文件的扩展名为.dtd
在这里插入图片描述

1、 DTD定义节点

利用DTD中的<!ELEMENT>标签,我们可以定义XML中允许出现的节点及数量,以hr.xml为例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DTD定义节点数量

如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

XML引用DTD文件

在XML文件中使用<!DOCTYPE>标签来引用DTD文件。
在这里插入图片描述

创建DTD文件

hr.dtd文件

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

<!ELEMENT company (employee+)>
        <!ELEMENT employee (name,age,department) >
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT department (dname,address)>
                <!ELEMENT dname (#PCDATA)>
                <!ELEMENT address (#PCDATA)>
<!ATTLIST name no CDATA "">

hr.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE company SYSTEM "hr.dtd">
<!-- 注释的写法 -->
<company>
    <employee>
        <name no="210">李思</name>
        <age>18</age>
        <department>
            <dname>研发部</dname>
            <address>西溪八方城</address>
        </department>
    </employee>
    <employee>
        <name no="210">王五</name>
        <age>20</age>
        <department>
            <dname>设计部</dname>
            <address>阿里事业部</address>
        </department>
    </employee>
</company>

2、 XML Schema

  • XML Schema比DTD更复杂,提供了更多功能。
  • XML Schema提供了数据雷类型、格式限定、数据范围等特效。
  • XML Schema是W3C标准。

DOM文档对象模型

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

Dom4j

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

1、Dom4j遍历XML

1.1 下载Dom4j的jar包
1.2 将jar包添加到工程
1.3 创建测试类 HrReader.java

package dom4j;

import org.dom4j.Attribute;
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 = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(file);
            // 获取XML文档节点的根节点
            Element root = doc.getRootElement();
            List<Element> employees = root.elements("employee");
            for (Element employee :employees) {
                Element name = employee.element("name");
                String empName = name.getText();// 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 = name.attribute("no");
                System.out.println(att.getText());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        HrReader reader = new HrReader();
        reader.readXml();
    }
}

2、利用Dom4j更新XML

创建HRWriter.java

package dom4j;

import org.dom4j.Attribute;
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 = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(file);
            // 获取XML文档节点的根节点
            Element root = doc.getRootElement();
            List<Element> employees = root.elements("employee");
            for (Element employee :employees) {
                Element name = employee.element("name");
                String empName = name.getText();// 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 = name.attribute("no");
                System.out.println(att.getText());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        HrReader reader = new HrReader();
        reader.readXml();
    }
}

XPath路径表达式

  1. XPath路径表达式时XML文档中查找数据的语言。
  2. XPath可以极大的提高在提取数据时的开发效率。
  3. XPath本质就是掌握各种形式表达式的使用技巧。

1、XPath基本表达式

XPath常用的基本表达式

在这里插入图片描述

XPath基本表达式案例

在这里插入图片描述

2、XPath谓语表达式

在这里插入图片描述

Jaxen

  • Jaxen是一个java编写的XPath库。这是适应多种不同的对象模型,包括DOM、XOM、dom4j、JDOM。
  • Dom4j底层依赖Jaxen实现XPath查询
  • Jaxen下载地址 : 下载

测试XPath

XPathTest .java

package 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 XPathTest {
    public void xpath(String xpathExp){
        String file = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);
            List<Node> nodes = document.selectNodes(xpathExp);
            for (Node node :nodes){
                Element ele = (Element) node;
                System.out.println(ele.elementText("name"));
                System.out.println(ele.elementText("age"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        XPathTest test = new XPathTest();

//      test.xpath("/company/employee");
//      test.xpath("//employee");
//        test.xpath("//employee[age<20]");
//        test.xpath("//employee[name='李思']");
//        test.xpath("//employee[1]");
        test.xpath("//employee[last()]");
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章