XML(从是什么到怎么用)

长文预警,可以收藏慢慢看,本文适合零基础学习,你们的三连是羽毛最大的动力

目录

  • XML是什么
    • XML与HTML的比较
    • XML的用途
  • XML文档结构
    • XML声明
    • XML标签书写规则
  • XML语义约束
      • DTD
        • DTD定义节点
        • DTD定义节点数量
        • XML引用DTD文件
        • 创建并使用DTD文件
      • XML Schema
  • XML文档解析及XPth语言
  • DOM文档对象模型
  • Dom4j
    • Dom4j遍历XML
    • 利用Dom4j更新XML
  • XPath路径表达式
    • XPath基本表达式
    • XPath基本表达式案例
    • XPath谓语表达式
  • XPath实验
    • Jaxen介绍

XML是什么

  • XML的全程是EXtensible Markup Language,可扩展标记语言
  • 编写XML就是编写标签,与HTML非常类似,扩展名 .xml
  • 具有良好的人机可读性

XML与HTML的比较

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

XML的用途

  • Java程序的配置描述文件
  • 用于保存程序产生的数据
  • 网络间的数据传输(例如webservice底层soap协议)

XML文档结构

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

XML声明

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

<?xml version="1.0" encoding="UTF-8"?>
//version 代表版本号1.0 encoding UTF-8 设置字符集,用于支持中文

在XML中所有的标签和属性都是可以进行自定义的,所以我们写的时候尽量让它与内容相匹配,增强可读性
例如:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 (这是注释) -->
<hr> <!-- 根节点  -->
    <employee no="857857">
        <name>张三</name>
        <age>31</age>
        <salary>4000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-A103</address>
        </department>
    </employee>
</hr>

如何使用IDEA创建xml文件:使用IDEA创建xml文件

目前大多数的浏览器对于xml提供了良好的校验和检查
如何使用浏览器对xml进行结构检查

XML标签书写规则

XML标签书写规则请移步此篇文章:XML标签书写规则

XML语义约束

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

DTD

DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式.
DTD文件的扩展名为.dtd

DTD定义节点

  • 利用DTD中的标签,我们可以定义XML文档中允许出现的节点及数量

<!ELEMENT hr (employee)>


<!ELEMENT employee (name,age,salary,department)>


<!ELEMENT name (#PCDATA)>

DTD定义节点数量

  • 如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符

<!ELEMENT hr (employee+)>


<!ELEMENT hr (employee*)>


<!ELEMENT hr (employee?)>

XML引用DTD文件

  • 在XML中使用标签来引用DTD文件
    书写格式:

创建并使用DTD文件

现在有一个.xml文件,要创建.dtd文件并且添加约束




<hr>
    <employee no="1111">
        <name>张三name>
        <age>18age>
        <salary>4000salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦address>
        department>
    employee>

hr>

创建一个.dtd文件(IDEA如何创建.dtd文件可以参考 IDEA如何创建.dtd文件)


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

XML Schema

  • XML Schema 比 DTD更为复杂,提供了更多功能
  • XML Schema 提供了数据类型,格式限定,数据范围等特性
  • XML Schema 是W3C标准
    (IDEA如何创建XML Schema文件可以参考 IDEA如何创建XML Schema文件)
    如何使用在代码中体现:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3school.com.cn"
           xmlns="http://www.w3school.com.cn"
           elementFormDefault="qualified">
    <xs:element name="hr">
        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="employee" minOccurs="1" maxOccurs="999">
                    
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string">xs:element> 
                            <xs:element name="age">
                                <xs:simpleType> 
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="18">xs:minInclusive>
                                        <xs:maxInclusive value="60">xs:maxInclusive>
                                        
                                    xs:restriction>
                                xs:simpleType>
                            xs:element>

                            <xs:element name="salary" type="xs:integer">xs:element>
                            <xs:element name="department">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="dname" type="xs:string">xs:element>
                                        <xs:element name="address" type="xs:string">xs:element>
                                    xs:sequence>
                                xs:complexType>
                            xs:element>
                        xs:sequence>
                        <xs:attribute name="no" type="xs:string" use="required">xs:attribute>
                        
                    xs:complexType>
                xs:element>
            xs:sequence>
        xs:complexType>
    xs:element>
xs:schema>

示例所用xml代码:



<hr xmlns="http://www.w3school.com.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="hr.xsd">
    
    <employee no="1111">
        <name>张三name>
        <age>19age>
        <salary>4000salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦address>
        department>
    employee>
hr>

XML文档解析及XPth语言

DOM文档对象模型

  • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素.
    举个栗子,就像这样
    XML(从是什么到怎么用)_第1张图片

Dom4j

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

Dom4j官网下载链接 404
这个链接不好使了,大家可以关注公众号:羽毛的技术栈 回复dom4j 免费获取dom4j的jar包
使用IDEA如何导入jar包

Dom4j遍历XML

例子所遍历的XML文件内容为




<hr>
    <employee no="1111">
        <name>张三name>
        <age>18age>
        <salary>4000salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦address>
        department>
    employee>

hr>

通过dom4j遍历XML需要创建一个.java文件:

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

import javax.xml.parsers.SAXParser;
import java.util.List;

public class HrReader {
    public void readXml(){
        //写入要读取的文件所在路径
        String file = "E:/JavaWeb/xml/src/hr.xml";
        //SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
        SAXReader reader = new SAXReader();
        try{
            //之前说过Dom4j将XML视为Document对象
            Document document = reader.read(file);
            //获取XML文档的根节点
            Element root = document.getRootElement();
            //element方法用于获取指定的标签集合
            List<Element> employees = (List<Element>) root.elements("employee");
            for(Element employee : employees){
                //用Attribute 遍历属性
                Attribute attribute = employee.attribute("no");
                System.out.println(attribute.getText());
                //直接通过 elementText() 方法来读出文本的值
                System.out.println(employee.elementText("name"));
                System.out.println(employee.elementText("age"));
                System.out.println(employee.elementText("salary"));
                //出现分支,获取节点
                Element department = employee.element("department");
                System.out.println(department.elementText("dname"));
                System.out.println(department.elementText("address"));
            }
        }catch (DocumentException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        HrReader hrReader = new HrReader();
        hrReader.readXml();
    }
}

遍历结果为:
XML(从是什么到怎么用)_第2张图片
可以看出,已经成功读出了XML中存储的值

利用Dom4j更新XML

import org.dom4j.Document;
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 writerXml(){
        //获取将要更新的xml的文件路径
        String file = "E:/JavaWeb/xml/src/hr.xml";
        //SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
        SAXReader reader = new SAXReader();
        try{
            Document document = reader.read(file);
            //获取根节点
            Element root = document.getRootElement();
            //获取节点
            Element employee = root.addElement("employee");
            //addAttribute()是添加属性
            employee.addAttribute("no","3311");
            //addElement()是添加文本
            employee.addElement("name").setText("李铁柱");
            employee.addElement("age").setText("25");
            employee.addElement("salary").setText("3600");
            Element department = employee.addElement("department");
            department.addElement("dname").setText("人事部");
            department.addElement("address").setText("XX大厦-B105");
            //以上代码实现了在内存中生成的步骤,下面要来将内存中的东西写到xml文件中
            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.writerXml();
    }
}

运行成功,xml文件中出现了我们添加的信息
XML(从是什么到怎么用)_第3张图片

XPath路径表达式

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

XPath基本表达式

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
选取当前节点的父节点
@ 选取属性

XPath基本表达式案例

路径表达式 结果
bookstore 选取bookstore元素的所有子节点
/bookstore 选取根元素bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于bookstore的子元素的所有book元素
//book 选取所有book子元素,而不管它们在文档中的位置
bookstore//book 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置。
//@lang 选取名为lang的所有属性

XPath谓语表达式

路径表达式 结果
/bookstore/book[1] 选取属于bookstore子元素的第一个book元素。
/bookstore/book[last()] 选取属于 bookstore子元素的最后一个book元素。
/bookstore/book[last()-1] 选取属于bookstore子元素的倒数第二个book元素。
/bookstore/book[position()< 3] 选取最前面的两个属于 bookstore元素的子元素的book元素。
//title[@lang] 选取所有拥有名为 lang的属性的title 元素。
//title[ @lang=‘eng’] 选取所有 title 元素,且这些元素拥有值为eng的lang属性。
/bookstore/book[price> 35.00] 选取bookstore元素的所有book元素,且其中的price元素的值须大于35.00.
/bookstore/book[price> 35.00]/title 选取bookstore元素中的book元素的所有title 元素,且其中的price元素的值须大于35.00

XPath实验

在使用XPath之前,需要做一些前置的准备工作,下载Jaxen并导入jar包

Jaxen介绍

  • Jaxen是一-个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM, XOM,dom4j和JDOM
  • Dom4j底层依赖Jaxen实现XPath查询
  • Jaxen 下载方式一: 地址— jaxen.codehaus.org (当然这个是被墙了的,如果没有翻出去的小伙伴可以通过另一种方法下载)
  • Jaxen 下载方式二 :打开阿里云的代码仓库https://maven.aliyun.com/mvn/search 然后搜索jaxen进行下载 (当然,如果还是觉得麻烦,那还有方式三)
  • Jaxen 下载方式三 :关注微信公众号:羽毛的技术栈 回复jaxen 免费获取jar包

使用IDEA而不会导入JAR包的看这里:使用IDEA如何导入jar包
这是需要查询的XML文件



<hr>
    <employee no="3301">
        <name>张三name>
        <age>18age>
        <salary>4000salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦-A104address>
        department>
    employee>

    <employee no="3302">
        <name>李铁柱name>
        <age>25age>
        <salary>3600salary>
        <department>
            <dname>人事部dname>
            <address>XX大厦-B105address>
        department>
    employee>

    <employee no="3303">
        <name>李二狗name>
        <age>19age>
        <salary>4500salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦-A104address>
        department>
    employee>

    <employee no="3304">
        <name>张顺溜name>
        <age>29age>
        <salary>4800salary>
        <department>
            <dname>人事部dname>
            <address>XX大厦-B105address>
        department>
    employee>
    <employee no="3305">
        <name>李四name>
        <age>25age>
        <salary>5000salary>
        <department>
            <dname>会计部dname>
            <address>XX大厦-A104address>
        department>
    employee>

    <employee no="3306">
        <name>王五name>
        <age>27age>
        <salary>6600salary>
        <department>
            <dname>人事部dname>
            <address>XX大厦-B105address>
        department>
    employee>

hr>

创建一个XPathTestor类

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 = "E:/JavaWeb/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.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 xPathTestor = new XPathTestor();
        xPathTestor.xpath("/hr/employee");
    }
}

运行结果
XML(从是什么到怎么用)_第4张图片
这样就能使用XPath了,大家可以一一尝试Xpath的效果

XML(从是什么到怎么用) 此文到此结束,若觉得写得还不错,点赞收藏顺便关注一下羽毛,下一篇将介绍Servlet

若有错误,请各位大佬指正
人与人之间最好的关系就是互相成就,你们的三连就是我最大的动力

你可能感兴趣的:(JavaWeb入门,java,xml,html)