前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XML学习笔记

XML学习笔记

原创
作者头像
逆回十六夜
修改2020-02-10 17:08:39
6060
修改2020-02-10 17:08:39
举报
文章被收录于专栏:逆回十六夜逆回十六夜

概念

XML:(Extensible Markup Language)可扩展标记语言

可扩展:标签都是自定义的。

功能:存储数据,可做配置文件,或者在网络中传输

XML和HTML的区别(引用于https://www.cnblogs.com/jqant/p/9497838.html

1. 在html中不区分大小写,在xml中严格区分。

2. 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。

3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。

4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 

5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。 

6. 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。

语法

基本语法

1.xml后缀名为.xml

2.xml第一行必须定义为文档声明(例如:<?xml version='1.0' ?> <!--文档声明-->),xml严格识别空格,第一行指绝对的第一行,否则无法解析。

3.xml文档中有且仅有一个根标签

4.属性值必须使用引号引起来

5.标签必须有结束标签

6.XML严格区分大小写

组成部分

1.文档声明

必须定义在第一行

格式<?xml 属性列表 ?>

属性列表:

version:版本号,必须属性

encoding:编码方式,告诉浏览器用什么编码解析,文本编辑器的编码格式应与encoding的解码格式相同,其中,高级的开发工具如eclipse或者idea等等,会自动修改文本编辑器的编码方式。

standalone:是否独立,指文件不依赖于其他的文件。standalone="yes" standalone="no",主要用于约束,但是实际上现在很少使用了。

2.指令

可以使用CSS样式,用来展示数据(但是实际上现在XML很少用于展示数据)

<?xml-stylesheet type="text/css" href="a.css" ?>

加上了这条语句页面就会用于展示而浏览器不再显示XML的树状结构

3.标签

规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

4.属性

如果XML文档中的内容出现了一些特殊字符,需要转义

<code> if(a < b && a > c){do something} </code>

会直接报错,其中< >需要转义

代码语言:javascript
复制
<code>
    if(a &lt; b &amp;&amp; a &gt; c){do something}
</code>

5.文本

CDATA区,在该区域的数据会被原样展示,无需转义

代码语言:javascript
复制
<code>
    <![CDATA[
        if(a < b && a > c){do something}
    ]]>
</code>

XML约束

软件的用户编写软件读取的XML,以供软件解析。同时软件应提供XML的约束规定书写规则。

DTD(系统教学https://www.w3school.com.cn/dtd/dtd_intro.asp

dtd好像无法约束实体的内容。。。

1.数据类型

  • PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

  • CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。

2.内部的DTD声明

代码语言:javascript
复制
<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

3.外部的DTD引用

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

代码语言:javascript
复制
<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

代码语言:javascript
复制
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

这是包含 DTD 的 "note.dtd" 文件:

代码语言:javascript
复制
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

schema(系统教学https://www.w3school.com.cn/schema/index.asp)

schema的作用

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

schema相对dtd的优势

  • XML Schema 可针对未来的需求进行扩展
  • XML Schema 更完善,功能更强大
  • XML Schema 基于 XML 编写
  • XML Schema 支持数据类型
  • XML Schema 支持命名空间

schema元素有类型区分

最常用的类型是:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

对元素的限定方法可通过比较区间进行限定

代码语言:javascript
复制
<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>

也可以通过枚举进行限定

代码语言:javascript
复制
<xs:element name="car">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

通过正则限定

代码语言:javascript
复制
<xs:element name="letter">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-z]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

示例代码

XML

代码语言:javascript
复制
<?xml version='1.0' encoding="GBK" ?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsdtest.xsd">
    <user id="1">
        <name>张三</name>
        <age>23</age>
        <gender>male</gender>
        <code>
            <![CDATA[
                if(a < b && a > c){do something}
            ]]>
        </code>
    </user>
    <user id="2">
        <name>LiSi</name>
        <age>24</age>
        <gender>famale</gender>
    </user>
</users>

DTD

代码语言:javascript
复制
<?xml version="1.0" encoding="gbk" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="users">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="user" type="xs:complexType" maxOccurs="unbounded"></xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="user">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="name" type="xs:string"></xs:element>
                <xs:element name="age" type="xs:string"></xs:element>
                <xs:element name="gender" type="xs:string"></xs:element>
                <xs:element name="code" type="xs:string"></xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:integer" default="0"/>
        </xs:complexType>

    </xs:element>
    <xs:attribute name="id" type="xs:integer"/>
</xs:schema>

额外注意,attribute的内容必须放置在最后,否则报错。

XML的解析

解析XML的方式:

1.DOM:

将标记语言文档一次性加载进入内存,在内存中会形成一颗DOM树

资料来源:https://www.bilibili.com/video/av80685927?p=18
资料来源:https://www.bilibili.com/video/av80685927?p=18

优点是操作方便,可以对文档进行C(reate)R(etrieve)U(pdate)D(elete)的所有操作

缺点是占用内存较多。

2.SAX:

逐行读取,基于事件驱动

优点是及时释放内存资源

缺点是不能CRUD

XML的常见解析器:

  • JAXP:SUN公司提供的解析器,支持DOM和SAX
  • DOM4J:一款优秀的解析器,基于DOM实现
  • Jsoup:是一款JAVA的HTML解析器,可直接解析URL地址,HTML文本内容
  • PULL:Android操作系统内置的解析器,基于sax

Jsoup的学习https://jsoup.org/download

步骤:

1:导入jar包

2:获取document对象

3:获取对应的标签element对象

4:获取数据

代码语言:javascript
复制
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;

public class jsoupDemo {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml文档获取
        //获取XML的path
        String path = jsoupDemo.class.getClassLoader().getResource("users.xml").getPath();
        //加载文档进内存,并获取DOM树
        Document document = Jsoup.parse(new File(path),"utf-8");
        //获取元素对象
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        //获取第一个element元素
        Element element = elements.get(0);
        System.out.println(element.text());
    }
}

jsoup的常见对象:

1.Jsoup:工具类,可以解析HTML或者XML,返回Document对象

  • parse:解析HTML或者XML,返回Document对象。其中有3个重载方法,解析文件,解析字符串,解析URL,写爬虫的时候比较方便
代码语言:javascript
复制
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.net.URL;

public class jsoupDemo {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml文档获取
        //获取XML的path
        String path = jsoupDemo.class.getClassLoader().getResource("users.xml").getPath();
        Document document = Jsoup.parse(new URL(new String("http://www.baidu.com")),2000);
        System.out.println(document);
    }
}

2.Document:文档对象,内存中的DOM树

  • getElementById:根据Id的值获取唯一的element对象
  • getElementByTag:根据标签名称获取元素对象集合
  • getElementByAttribute:根据属性名称获取元素对象集合
  • getElementByAttributeValue:根据属性的值获取元素对象的集合
  • ......

3.Elements:Element对象的集合,类似于ArrayList<Element>

  • 获取属性值,attr(String attrName)属性名称不区分大小写
  • 获取文本内容,String text()
  • 获取标签体在内的所有内容,String html()

4.Element:元素对象

5.Node:节点对象

  • 是Document和Element的父类

快捷查询

1.selector:

使用的方法:Elements select(String cssQuery)

2.Xpath:

https://www.w3school.com.cn/xpath/xpath_syntax.asp

Xpath为XML路径语言

使用Jsoup的Xpath需要额外导入jar包

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 语法
    • 基本语法
      • 组成部分
        • 1.文档声明
        • 2.指令
        • 3.标签
        • 4.属性
        • 5.文本
      • XML约束
        • DTD(系统教学https://www.w3school.com.cn/dtd/dtd_intro.asp)
        • schema(系统教学https://www.w3school.com.cn/schema/index.asp)
        • 最常用的类型是:
      • XML的解析
        • 1.DOM:
        • 2.SAX:
        • XML的常见解析器:
        • Jsoup的学习https://jsoup.org/download
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档