2、XML配置文件

XML配置文件

  • 概述
  • XML语法
  • 约束文档
  • XML解析
  • Jsoup解析

一、概述

1.1、简介

  XML,可扩展标记语言(Extensible Markup languege)。XML是可以被浏览器直接解析的。
  由来:简单说就是W3C给HTML生了一个弟弟XML,想用来取代HTML,结果弟弟被哥哥暴打了一顿,转角又遇到了路人properties,然后弟弟又将properties暴打了一顿。然后弟弟成功的独立了…

1.2、作用

  1. 配置文件
  2. 传输数据

1.4、与HTML的区别

  • HTML不允许自定义标签。而XML除了极少数的标签是系统保留的,其它所有的标签都是需要自定义的。
  • HTML语法松散,XML语法非常严格
  • HTML是用来展示数据的,XML是用来存储数据的

二、XML语法

2.1、文档声明

​ 文档声明必须有且位于xml的第一行,否则报错。

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><!--文档声明-->
<?xml-stylesheet type='text/css' href='../css/test1.css' ?><!--css样式引入-->
  • version:版本号,必须要写,否则报错
  • encoding:编码方式,告知解析引擎当前文档使用的字符集。可以不写,默认:ISO-8859-1
  • standalone:yes/no,表示文件是否独立。

2.2、根标签

  必须有且只能有一个根标签,否则报错。

<?xml version='1.0' ?>
<home>
    <!--文档内容写在这里面-->
</home>

2.3、普通标签

  包括根标签在内的所有标签,必须要成对出现,否则报错。除非是自闭合标签,比如:</??>
  标签名不能以数字、标点符号、敏感单词(XML、Xml等)开头,也不能包含空格。

<?xml version='1.0' ?>
<users>
    <user></user>
</users>

2.4、标签属性

  与HTML一样,XML也是有属性的,用于提供有关元素的额外信息。属性值必须使用引号(单双都可)引起来,否则报错。

<?xml version='1.0' ?>
<users>
    <user id='1'></user><!--id作为一个标签的唯一标识,必须唯一-->
</users>

2.5、文本

  XML对大小写是极其敏感的。特殊字符需要转义,转义符参考HTML。

<?xml version='1.0' ?>
<users>
    <user>
    	<name><![CDATA[cdata区里面的内容可以不用转义]]></name><!--想要不转义,只能使用cdata区-->
        <message></message>
    </user>
</Users><!--直接报错-->

2.6、常用的特殊字符

特殊字符对应的转义字符
>&gt;
<&lt;
&&amp;
&apos;
"&quot;

三、约束文档

  用于限定XML文档的内容,使之只能按照约束文档的规则定义标签、属性等。

3.1、dtd约束文档

  1. 内部dtd文档,写在xml内部的约束文档,用的极少

    <?xml version='1.0' ?>
    <!DOCTYPE person [
    	<!ELEMENT person (student*)>
    	<!ELEMENT student (name,age,sex)>
    	<!ELEMENT name (#PCDATA)>
    	<!ELEMENT age (#PCDATA)>
    	<!ELEMENT sex (#PCDATA)>
    	<!ATTLIST student number ID #REQUIRED>
    ]><!--dtd约束文档,针对于当前xml文档有效-->
    
  2. 外部dtd文档,解析如下

    <!ELEMENT person (student+)>
    <!--
    ELEMENT:标签约束
    ATTLIST:属性约束
    person:根标签名
    student:子标签名
    +:代表子标签的个数,至少一个
    *:至少0个
    ?:0个或1个
    -->
    <!ELEMENT student (name,age,sex)>
    <!--
    student (name,age,sex):代表student标签有3个子标签(按序)——>name、age、sex
    -->
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>
    <!--
    student:标签名
    number:属性名
    ID:属性值必须唯一
    #REQUIRED:>表示必填的属性
    #IMPLIED:可填可不填的属性
    #FIXED "value":固定值value
    #PCDATA:标签内容为文本
    -->
    
    <?xml version='1.0' ?>
    <!DOCTYPE person SYSTEM "student.dtd">
    <!--引入dtd约束文档的格式:
    person:dtd文档名
    SYSTEM/PUBLIC:本地文档/外网文档
    "student.dtd":本地绝对路径/URL
    -->
    <person>
        <student number="qwer">
            <name>qewr</name>
            <age>qwer</age>
            <sex>qwer</sex>
        </student>
    </person>
    

3.2、Schema约束文档

  可以看错是dtd的加强版,可以约束标签内容。

四、XML解析

  操作XML文档,读取文档中的数据进内存。

4.1、解析方式

  1. DOM解析:将XML文档中的数据一次性全部写进内存,形成一个DOM树。好处是处理起来方便,CRUD都可以完成。坏处是当文档比较大时很占内存。
  2. SAX解析:逐行读取,基于事件驱动。好处是不占内存,坏处是没办法修改XML文档内容。一般都是应用于移动端。

4.2、常见的解析器

  1. JAXP:sun公司提供的解析器,支持DOM和SAX两种解析方式,不好用,性能还很差。
  2. DOM4J:目前用的最多的解析器。
  3. Jsoup:一款用于HTML的解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM、CSS和类似JQuery的操作方式来提取、修改数据。
  4. PULL:Android操作系统内置的解析器,SAX方式解析的。

五、Jsoup解析

5.2、常用对象

  1. Jsoup对象,主要用于解析HTML/XML文件,返回内存中的DOM树(Document对象)。
    • Document parse(File file,String encoding):接收一个HTML/XML文件对象和字符集,返回Document对象
    • Document parse(String xml):接收一个符合XML语法的字符串,返回Document对象
    • Document parse(URL url,int timeoutMillis):接收一个URL网络对象和超时时间,返回Document对象
  2. Document对象,文档对象,代表内存中的DOM树。
    • getElementById(String id):根据id属性值获取唯一的Element对象。
    • getElementByTag(String tagName):根据标签名获取Element对象集合。
    • getElementByAttribute(String key):根据属性名获取Element对象集合。
    • getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取Element对象集合。
  3. Elements对象,Element对象的集合,可以当作是ArrayList<Element>来使用
  4. Element对象,
    • getElementById(String id):根据id属性值获取唯一的子元素对象。
    • getElementByTag(String tagName):根据标签名获取子元素对象集合。
    • getElementByAttribute(String key):根据属性名获取子元素对象集合。
    • getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取子元素对象集合。
    • String attr(String key):根据属性名获取属性值
    • String text():获取文本内容
    • String html():获取首尾标签中间的所有内容,包括子元素标签及其文本。保留换行符但不保留无效空格。
  5. Node对象,节点对象,是Document和Element的父类。

5.2、常用解析步骤

  1. 导入jar包

    Jsoup-1.11.2.jar

  2. 获取XML文件的绝对路径

    String path = Test1.class.getClassLoader().getResource("Test1.xml").getPath();
    
  3. 创建文件对象

    File file = new File(path);
    
  4. 解析XML/HTML文件,返回DOM树——document

    Document document = Jsoup.parse(file, "UTF-8");
    
  5. 根据标签名获取Element对象集合。(毕竟没办法保证没有同名标签)

    ArrayList<Element> list = document.getElementsByTag("name");
    Element element = list.get(1);//根据需求取对象
    
  6. 获取数据

    String value = element.text();//获取标签中保存的文本
    

5.3、使用CSS选择器查找Element节点

//导入Jsoup-1.11.2.jar包
String path = Test1.class.getClassLoader().getResource("Test1.xml").getPath();
File file = new File(path);
Document document = Jsoup.parse(file, "UTF-8");
Elements elements1 = document.select("name");//标签选择器
Elements elements2 = document.select("#student");//id选择器
Elements elements3 = document.select("teacher>name");//组合选择器
//操作elements集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值