XML配置文件
- 概述
- XML语法
- 约束文档
- XML解析
- Jsoup解析
一、概述
1.1、简介
XML,可扩展标记语言(Extensible Markup languege)。XML是可以被浏览器直接解析的。
由来:简单说就是W3C给HTML生了一个弟弟XML,想用来取代HTML,结果弟弟被哥哥暴打了一顿,转角又遇到了路人properties,然后弟弟又将properties暴打了一顿。然后弟弟成功的独立了…
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、常用的特殊字符
特殊字符 | 对应的转义字符 |
---|---|
> | > |
< | < |
& | & |
’ | ' |
" | " |
三、约束文档
用于限定XML文档的内容,使之只能按照约束文档的规则定义标签、属性等。
3.1、dtd约束文档
-
内部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文档有效-->
-
外部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、解析方式
- DOM解析:将XML文档中的数据一次性全部写进内存,形成一个DOM树。好处是处理起来方便,CRUD都可以完成。坏处是当文档比较大时很占内存。
- SAX解析:逐行读取,基于事件驱动。好处是不占内存,坏处是没办法修改XML文档内容。一般都是应用于移动端。
4.2、常见的解析器
- JAXP:sun公司提供的解析器,支持DOM和SAX两种解析方式,不好用,性能还很差。
- DOM4J:目前用的最多的解析器。
- Jsoup:一款用于HTML的解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM、CSS和类似JQuery的操作方式来提取、修改数据。
- PULL:Android操作系统内置的解析器,SAX方式解析的。
五、Jsoup解析
5.2、常用对象
- 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对象
- Document对象,文档对象,代表内存中的DOM树。
- getElementById(String id):根据id属性值获取唯一的Element对象。
- getElementByTag(String tagName):根据标签名获取Element对象集合。
- getElementByAttribute(String key):根据属性名获取Element对象集合。
- getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取Element对象集合。
- Elements对象,Element对象的集合,可以当作是ArrayList<Element>来使用
- Element对象,
- getElementById(String id):根据id属性值获取唯一的子元素对象。
- getElementByTag(String tagName):根据标签名获取子元素对象集合。
- getElementByAttribute(String key):根据属性名获取子元素对象集合。
- getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取子元素对象集合。
- String attr(String key):根据属性名获取属性值
- String text():获取文本内容
- String html():获取首尾标签中间的所有内容,包括子元素标签及其文本。保留换行符但不保留无效空格。
- Node对象,节点对象,是Document和Element的父类。
5.2、常用解析步骤
-
导入jar包
Jsoup-1.11.2.jar
-
获取XML文件的绝对路径
String path = Test1.class.getClassLoader().getResource("Test1.xml").getPath();
-
创建文件对象
File file = new File(path);
-
解析XML/HTML文件,返回DOM树——document
Document document = Jsoup.parse(file, "UTF-8");
-
根据标签名获取Element对象集合。(毕竟没办法保证没有同名标签)
ArrayList<Element> list = document.getElementsByTag("name"); Element element = list.get(1);//根据需求取对象
-
获取数据
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集合