XML文件基本原理及其解析

43 篇文章 2 订阅
12 篇文章 2 订阅

什么是XML文件

XML文件及叫Extensible Markup Language 可扩展标记语言,XML可扩展性体现在其标签都是可以自定义的。如<teacher> <student>.

基本背景

XML和HTML是兄弟关系,XML语法非常严格,最初也被发明用来展示网页,但是对于网页脚本XML文件并没有多少竞争力,所以XML文件开始用来存储配置文件,并且改文件有很大的市场,由此可以得出XML文件的主要功能。

XML文件能做什么

功能

  1. 配置网络文件
  2. 在网络中传输

xml和html的区别

  1. xml标签都是自定义的,html标签是预定义。
  2. xml的语法严格,html语法松散
  3. xml是存储数据的,html是展示数据

如何使用XML文件

xml文档语法

  1. xml文档的后缀名 .xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可)引起来
  5. 标签必须正确关闭
  6. xml标签名称区分大小写

xml组成部分

文档申明
  1. 格式: <?xml 属性列表 ?>
  2. 属性列表
    version:版本号,必须的属性
    encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
    standalone:是否独立
    取值:
    yes:不依赖其他文件
    no:依赖其他文件
指令
<?xml-stylesheet type="text/css" href="a.css" ?>

指令可以定义或者是引入样式。

签名

标签名称可实现自定义,其规则如下:

  1. 名称可以包含字母、数字以及其他的字符
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字母 xml(或者 XML、Xml 等等)开始
  4. 名称不能包含空格
属性:

标签id属性需要唯一

文本

如果没有CDATA区,
CDATA区:在该区域中的数据会被原样展示
格式: <![CDATA[ 数据 ]]>

xml 约束文档

约束

规定xml文档的书写规则,作为框架的使用者(程序员):

  1. 能够在xml中引入约束文档
  2. 能够简单的读懂约束文档
分类
  1. DTD:一种简单的约束技术
  2. Schema:一种复杂的约束技术
DTD:

引入dtd文档到xml文档中
内部dtd:将约束规则定义在xml文档中
外部dtd:将约束的规则定义在外部的dtd文件中
本地:
网络:

小例子
dtd外部文件约束

<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number  ID #REQUIRED>

xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--外部文件约束引入方式-->
<!DOCTYPE students SYSTEM "student.dtd">
<!--内部文件约束引入-->
<!--<!DOCTYPE students [
        <!ELEMENT students (student+)>
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ATTLIST student number  ID #REQUIRED>
        ]>-->
<students>
    <student number="stu01">
        <name>zhangsan</name>
        <age>27</age>
        <sex>male</sex>
    </student>
    <student number="stu02">
        <name>lisi</name>
        <age>35</age>
        <sex>female</sex>
    </student>
</students>

由于DTD约束的实际内容非常有限,约束项内容往往不能做到精细化管控,所以又出现了新的约束Schema文件约束。

Schema

引入:

  1. 填写xml文档的根元素
  2. 引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
  4. 为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
    schema约束小练习:
    schema约束文件:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://www.openedv.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.openedv.com/xml"
            elementFormDefault="qualified" >
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0"
                         maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type= "ageType"/>
            <xsd:element name="sex" type="sexType"/>
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction>
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="feitian_\d{3}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

xml配置文件:

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

<students  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.openedv.com/xml"
           xmlns:a="http://www.openedv.com/xml"
           xmlns:b="http://www.openedv.com/xml"
           xsi:schemaLocation = "http://www.openedv.com/xml student.xsd">
    <student number="feitian_001">
        <name>tom</name>
        <age>1</age>
        <sex>male</sex>
    </student>
    <a:student number="feitian_002">
        <name>lucy</name>
        <age>34</age>
        <sex>male</sex>
    </a:student>
    <b:student number="feitian_003">
        <name>jack</name>
        <age>34</age>
        <sex>male</sex>
    </b:student>
</students>

文件解读
在这里插入图片描述

XML文件解析

概念:操作xml文档,将文档中的数据加载到内存中

操作xml文档

解析:将XML 文档中数据正确的读取到内存中
写入:按照xml语法格式,将内存中的数据写入到xml文档中,实现数据持久化存储。

解析xml文件的方式
  1. DOM: 将标记语言文档一次性家载入内存中,在内存中形成一颗DOM树
    优点:操作便捷,直接可以对文档进行CRUD操作
    缺点:非常占用内存资源
  2. SAX:逐行读取,基于事件驱动
    优点:不占内存
    缺点:只能读取,无法进行数据的CRUD
    一般情况下,在服务端会采用DOM的操作思想,在移动端采用SAX思想。
xml常见的解析器
  1. JAXP:sun公司提供的解析器,支持dom和dax两种思想。
  2. DOM4J:一款非常优秀的解析器。
  3. Jsoup; jsoup是一款java的Html解析器,可直接解析摸个URL地址,HTML文本内容。他提供了一套非常省力的api,可通过DOM,CSS以及类似于jQuery的操作方法来去除和操作数据。
  4. PULL: Android操作系统内置的解析器,sax方式的。
Jsoup使用步骤

1、导入jar包
2、获取Document对象
3、获取对应的标签Element对象
4、获取数据

Jsoup中对象的使用

1.Jsoup:工具类,可以解析html或xml文档,返回Document对象。
parse: 解析html或xml文档,返回Document对象。

:解析xml或html文件的。
parse​(File in, String charsetName);
//解析xml或html字符串
parse​(String html);
通过网络路径获取指定的html或xml的文档
parse​(URL url, int timeoutMillis);
  1. Document:文档对象。代表内存中的dom树
//根据id属性值获取唯一的element对象
getElementById​(String id);
//根据标签名称获取元素对象集合
getElementsByTag​(String tagName);
//根据属性名称获取元素对象集合
getElementsByAttribute​(String key);
//根据对应的属性名和属性值获取元素对象集合
getElementsByAttributeValue​(String key, String value);
  1. Elements: 元素Elements对象集合,可以当做ArrayList 来使用
  2. element:元素对象
    1)获取子元素对象
//根据id属性值获取唯一的element对象
getElementById​(String id);
//根据标签名称获取元素对象集合
getElementsByTag​(String tagName);
//根据属性名称获取元素对象集合
getElementsByAttribute​(String key);
//根据对应的属性名和属性值获取元素对象集合
getElementsByAttributeValue​(String key, String value);

2)获取属性值

//获取文本内容
String text();
//获取标签体的所有内容
String html();
  1. Node: 节点对象
    是Document和Element的父亲节点。
快捷查询方式
  1. selector:选择器(Jsoup 自带)
    使用方法: Elements select(String cssQuery);
  2. XPath(XPath 是由中国人写的)
    使用Jsoup的Xpath需要额外导入jar包。
    查询w3cshool参考手册,使用xpath的语法完成查询
综合小案例

综合练习element、select、xpath的用法
约束文件与上文所提及的约束文件是一样的:下面是整个小案例的目录结构:
在这里插入图片描述
需要解析的xml文件

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

<students xmlns="http://www.openedv.com/xml">
    <student number="feitian_001">
        <name>leizhancun</name>
        <age>12</age>
        <sex>male</sex>
    </student>
    <student number="feitian_002">
        <name>lucy</name>
        <age>28</age>
        <sex>female</sex>
    </student>

    <student number="feitian_003">
        <name id="sheet">
            <xing>simth</xing>
            <ming>jack</ming>
        </name>
        <age>13</age>
        <sex>male</sex>
    </student>
</students>

解析案例,使用element对象

package com.feitian.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //获取
        String path = JsoupDemo01.class.getClassLoader().getResource("a.xml").getPath();
        //获取document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        //
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.get(0));
        System.out.println("--------------------------------------------------------");
        String name = elements.text();
        System.out.println(name);
        /*URL url = new URL("https://baike.baidu.com/item/%E5%AD%9F%E2%BC%A6%E4%B9%89/19435533");
        Document document1 = Jsoup.parse(url, 10000);
        System.out.println("-----------------------------------------------------------------------------");
        System.out.println(document1);*/
        System.out.println("-----------------------------------------------------------------------------");
        Elements names = document.getElementsByTag("name");
        System.out.println(names.html());

        System.out.println("-----------------------------------------------------------------------------");
        Element ele_student = document.getElementsByTag("student").get(1);
        Elements ele_name = ele_student.getElementsByTag("name");
        System.out.println(ele_name);
        System.out.println("-----------------------------------------------------------------------------");
        //获取内容
        String ele_text = ele_student.text();
        System.out.println(ele_text);
        System.out.println("-----------------------------------------------------------------------------");
        //获取文本表示形式
        String ele_html = ele_student.html();
        System.out.println(ele_html);
    }
}

查询案例,使用select和XPath选择器

package com.feitian.jsoup;

import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class JsoupDemo02 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        String path = JsoupDemo02.class.getClassLoader().getResource("a.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        Elements elements = document.select("name");
        System.out.println(elements);
        System.out.println("-----------------------------------------------");
        //根据id查询元素。
        Elements ele1 = document.select("#sheet");
        System.out.println(ele1);
        System.out.println("------------------------------------------------");
        //获取student标签并且number属性值为feitian_001的字标签。
        Elements ele2 = document.select("student[number='feitian_003']");
        System.out.println(ele2);
        System.out.println("-----------------------------------------------");
        //xpath使用student标签选择
        JXDocument jxDocument = new JXDocument(document);
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        // xpath 根据name标签选择
        System.out.println("-------------------------------------------");
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }
        //xpath 根据id选取
        System.out.println("--------------------------------------------");
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='sheet']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}

如何判断XML文件编写是否正确

编写一下代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<users>
     <user id='1'>
         <name>zhangsan</name>
         <age>123</age>
         <gender>male</gender>
     </user>
     <user>
         <name>lisi</name>
         <age>24</age>
         <gender>male</gender>
     </user>
     <user>
         <name>tangyan</name>
         <age>32</age>
         <gender>female</gender>
     </user>
</users>

因为xml文件可以被大部分浏览器引擎解析,若浏览器能成功解析并没有报错,就可以说明xml 文件编写的没有任何语法错误。
验证方法:将xml文件拖入到浏览器中。
在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值