XML学习笔记

XML(可扩展标记语言)


1.概念 :

  • Extensible Markup Language : 可扩展标记语言
    • 可扩展 : 标签都是自定义的. 可以自己设置标签名
  • 功能 : 存储数据
    • 1.作为配置文件
    • 2.在网络中传输
  • xml 和 html的区别
    • 早期只有html , 由于浏览器厂商之间的竞争 , 导致浏览器解析html的时候没有太大限制 , 基本上语法随便写就有浏览器能够解析 , 造成html的语法十分松散 , 没有限制
    • 后来W3C联盟 , 推出了xml , 一个语法非常严格的标记语言 , 最开始是和html进行竞争 , 但是因为html语法很松散 , 所以xml并没有对html造成太大压力
    • 再后来 , xml开始与properties配置文件 , 进行竞争 , 用来存放数据这些功能
  • 总结 :
    • 1.xml标签都是自定义的 , html标签是预定义的
    • 2.xml语法十分严格 , html语法松散
    • 3.xml 是存储数据的 , html 是展示数据的

2.语法

(1)基本语法 :

  • 1.XML的后缀名是 xml
  • 2.XML的**第一行(空行了但是在文档中是第一行也不行)**必须定义为 文档声明 : <?xml version='1.0' ?>
  • 3.XML文档中有且仅有一个根标签 (所有的标签都是这个标签的子标签)
  • 4.属性值必须使用 " "’ ’ 引起来
  • 5.标签必须要有结束标签 或者是一个自闭和的标签 : 如 :
  • 6.XML标签的名称区分大小写
<?xml version='1.0' ?>
<!--版本-->
<users>
	<user id='1'>
		<name>zhangsan</name>
		<age>23</age>
		<genter>male</genter>
	</user>
	<user id='2'>
		<name>lisi</name>
		<age>24</age>
		<genter>male</genter>
	</user>
</users>
  • 只要将xml文件拖到浏览器中 , 浏览器能够解析就是没有问题
  • 1643372934244

(2)组成部分 :

1.文档声明
  • ①格式 : <?xml version='1.0' ?>
  • ②属性列表 :
    • version : 版本号 (必须的属性)
    • encoding : 编码方式 告知解析引擎 当前文档使用的字符集
      • 默认值为 ISO-8859-1
      • 设置的值 必须要和文档中写的编码方式一致 , 不然就会报错
    • standalone : 是否独立
      • 默认 独立 : yes
      • yes : 独立 不依赖其他文件
      • no : 依赖于其他文件 (约束文件)
2.指令(了解)
  • 结合css使用的

  • <?xml-stylesheet type='text/css' href='a.css' ?>
    <!--引入css的样式 , href里边填写css文件的文件名-->
    
3.标签
  • 标签的名称是自定义的
  • 规则 :
    • 名称可以包含字母 , 数字 , 以及其他的字符
    • 名称不能以数字或者标点符号开始
    • 名称不能以字母 , xml (或者XML , Xml等)开始
    • 名称不能包含空格
4.属性
  • id属性值唯一
5.文本
  • 特殊字符 , 要使用转义字符来表示

  • 不想要写转义字符的话 , 就要使用 CDATA区 来包裹

  • <自定义>
            <![CDATA[
                if(a < b && a > c){}
            ]]>
    </自定义>
    

3.约束

  • 谁编写xml —用户 , 软件使用者 (框架使用者 程序员)
  • 谁解析xml —软件 (半成品软件 , 框架)
  • 1643383863710

约束 : 规定xml文件的书写规则 ,

  • 作为框架的使用者 (程序员):
    • 能够在xml中引入约束文档
    • 能够简单的读懂约束文档

(2)分类 :

①DTD : 一种简单的约束技术 (后缀为 .dtd)
  • 引入DTD文档到xml文档中

    • 内部DTD , 将约束规则定义在xml文件中

      • <!DOCTYPE 根标签名 [
        	dtd的约束内容
        ]>
        
    • 外部DTD , 将约束的规则定义在外部的dtd文件中

      • 本地的 : 在xml文档的第二行 :

        • <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
          
      • 网络中的 :

        • <!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置">
          
      • 根标签就是dtd文件中定义的 (也就是xml的根标签名)

  • 缺点 : 数据没有限制 , 能够随便书写


② Schema : 一种复杂的约束技术 (后缀为 .xsd)
  • 相对于DTD , Schema做出了更加严格的约束技术 ,

  • 严格规定了 数据的类型 , 数量 , 内容 等条件

  • 引入 :

    • 1.填写xml文档的根元素

    • //1.引入xsi前缀
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      //2.引入xsd文件命名空间 (student.xsd前边的一串相当于起一个别名)
      xsi:schemaLocation="http://www.sichen.cn/xml student.xsd"
      //3.为每一个xsd约束声明一个前缀 , 作为标识 
      xmlns:(跟自己命名的标记 , 在以后使用的时候 , 使用那个约束 ,就可以直接使用  (命名的标记:) 来标记自己想要使用这个约束的标签 )="http://www.sichen.cn/xml"
      
      
  • 解析 : 操作xml文档 , 将文档中的数据读取到内存中

    • 操作xml文档
      • 解析(读取) : 将文档中的数据读取到内存中
      • 写入 : 将内存中的数据保存到xml文档中 , 持久化的存储
  • 解析xml的方式

    • 1.DOM : 将标记语言文档一次性加载进内存 , 在内存中形成一颗DOM树
      • 优点 : 操作比较方便 , 可以对文档进行CRUD所有操作
      • 缺点 : 这个树要比文档内存占用大概1000到10000倍之间 , 非常占用内存
    • 2.SAX : 逐行读取 , 基于事件驱动的
      • 读一行释放一行 , 这样内存中只有一行的内存 ,
      • 事件驱动 , 当读取到一个开始标签的时候 , 读取的标签种类不同 , 执行的事件方法不同
      • 优点 : 不占内存 : 适用于一些内存较小的地方
      • 缺点 : 只能读取 , 不能写入

4.xml常见的解析器

(1)常见解析器

(1) JAXP : SUN公司提供的解析器 , 支持dom和sax 两种思想

(2) DOM4J : 一款非常优秀的解析器

(3) Jsoup : 本来是用来解析html文档的 , 但是也用来解析xml

(4) PULL : Android 操作系统内置的解析器 , sax方式的


(2)Jsoup解析器 :

步骤 :
  • 1.导入jar包
  • 2.获取Document对象
  • 3.获取对应的标签Element对象
  • 4.获取数据
package 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.URISyntaxException;
/**
 * Jsoup快速入门
 */
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException, URISyntaxException {
        //2.获取Document对象 , 根据文档获取对象
        //2.1 获取jsoup_demo1.xml文件的path
        String path = JsoupDemo1.class.getClassLoader().getResource("jsoupdemo1.xml").toURI().getPath();
        //2.2解析xml文档 , 加载文档进内存 , 获取dom树 , ---> document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取元素对象 , Element对象
        Elements elements = document.getElementsByTag("name");
        //这里的elements可以当做一个list看待
        for (Element element : elements) {
            //获取每一个的文本数据 , 并打印
            System.out.println(element.text());
        }
    }
}
对象的使用 :
  • Jsoup : 工具类 , 可以解析 html或xml 文档 , 返回Document对象

    • parse : 解析html文档或xml文档 , 返回一个Document对象 ,

    • 这个方法有很多重载方法

    • - parse(File in , String charsetName) : 解析xml或者html文件
      - parse(String html) : 解析xml或者html字符串的
      - parse(URL url , int timeoutMillis) : 通过网络路径指定的html或xml文档对象 , 访问路径加超时时间
      
      方法二 : 
      String str = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
                      "<users>\n" +
                      "    <user id=\"1\">\n" +
                      "        <name>思尘</name>\n" +
                      "        <age>23</age>\n" +
                      "        <genter>男</genter>\n" +
                      "    </user>\n" +
                      "</users>";
      Document document = Jsoup.parse(str);
      
      方法三 : 可以用来爬取网页数据
      URL url = new URL("https://baike.so.com/doc/6847312-7064737.html");
      Document document = Jsoup.parse(url , 3000);//3000是超时时间
      
  • Document : 文档对象 , 代表内存中的dom树

    • 获取Element对象

      • - getElementById(String id) : 根据id获取元素对象
        - getElementsByTag(String tagName) : 根据标签名称获取元素对象集合
        - getElementsByAttribute(String key) : 根据属性名称来获取元素对象集合
        - getElementsByAttributeValue(String key , String value) : 根据对应的属性名和属性值来获取元素对象集合
        
  • Elements : 元素 Element对象的集合 , 可以当做ArrayList来使用

  • Element : 元素对象

    • 1.获取子元素对象

    • - getElementById(String id) : 根据id获取元素对象
      - getElementsByTag(String tagName) : 根据标签名称获取元素对象集合
      - getElementsByAttribute(String key) : 根据属性名称来获取元素对象集合
      - getElementsByAttributeValue(String key , String value) : 根据对应的属性名和属性值来获取元素对象集合
      
    • 2.获取属性值 :

      • String attr(String key) :根据属性名称获取属性值
      • 不区分大小写
    • 3.获取文本内容 :

      • String text() : 获取文本内容 (获取的是所有子标签的纯文本内容)
      • String html() : 获取标签体的所有内容 (包括子标签的字符串内容)
  • Node : 节点对象

    • 是Document 和Element 的父类

快捷查询方式 :

多个标签嵌套的的时候 , 想要找到对应的标签是很麻烦的 ,

1.selector : 选择器
  • 使用方法 : Elements select(String cssQuery)

    • 语法 : 和css的语法几乎没什么区别

      //查询所有name标签
      Elements name = document1.select("name");
      System.out.println(name);
      //查询 id值为2的元素
      Elements select = document1.select("#2");
      //查询user标签 , 并且id值等于2的 age 的内容
      Elements select1 = document1.select("user[id='2'] > age");
      
2.XPath : xml路径语言

专门用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言 ,

  • 注意 : 使用Jsoup的XPath需要额外的导jar包

  • 查询w3school参考手册 , 使用XPath的语法完成查询

  • <dependency>
            <groupId>cn.wanghaomiao</groupId>
            <artifactId>JsoupXpath</artifactId>
            <version>0.3.2</version>
    </dependency>
    
  • 查询所有的指定的标签 , 不考虑它的位置

  • //括号内的标签前加两个斜杠  //
    List<JXNode> jxNodes = jxDocument.selN("//genter");
    
  • 查询所有student标签下的name标签

  •  List<JXNode> jxNodes1 = jxDocument.selN("//user/name");
    
  • 查询user标签下带有 id 属性的name标签

  • List<JXNode> jxNodes = jxDocument.selN("//user/name[@id]");
    
  • 查询user标签下带有 id 属性的name标签 , 且id属性值为2的标签

  • List<JXNode> jxNodes = jxDocument.selN("//user/name[@id='2']");
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值