引言
- 理财投资真的很让人着魔,怪不得有人赌上倾家荡产;
- 据开学还有28天;
- 从阿尔斯通,到Bytedance,无法评价,可能只是立场不同;
知识点总结
概念
- XML(Extensible Makeup Language)指可拓展的标志语言;
- 用于传输和存储数据;
与HTML的区别
- XML的标签是可自定义的,而HTML的是预定义的;
- XML的语法严格,而HTML的语法松散;
- XML用于存储数据,HTML用于展示数据;
语法
基本语法
- XML的文件声明必须放在第一行;
<?xml version='1.0'?>
- XML元素的属性必须加上(单/双)引号;
- 有且只有一个根目录;
- 标签必须正确关闭;
- 标签区分大小写;
快速入门
<?xml version='1.0'?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
组成部分
一个XML文档分为以下几个部分:
1.文档声明
<?xml 属性 ?>
属性列表:
versin="";版本
encoding="";使用的字符集
standalone="yes/no";是否依赖其他文件
2.指令
<?... ?>
常用于文档声明或连接CSS文件;
<?xml-stylesheet type="text/css" href="T1.css" ?>
3.标签
标签是自定义的,但是格式要注意:
- 名称可以包含字母、数字以及其他的字符 ;
- 名称不能以数字或者标点符号开始 ;
- 名称不能以字母 xml(或者 XML、Xml 等等)开始 ;
- 名称不能包含空格 ;
4.属性
属性值必须加引号;
5.文本CATA区
先介绍一下XML的实体引用:
在XML中,“<“,”&“等字符是不能直接放在文档中的,会产生XML错误,所以要用实体引用代替;
但这样比较麻烦,我们可以把带有特殊字符的语句放在CDATA区中;原理是CADTA区中文本会被解析器忽略,可以原封不动的打印出来;
<![CDATA[A > B]]>
============
格式
<![CDATA[数据]]>
约束
约束的概念
因为XML文档的自定义性太强,所以我们在使用时需要一个约束文档来对XML文档进行约束,从而保证数据的规范性与安全性;
约束的分类
1. DTD:一种简单的约束技术
<!DOCTYPE note [
<!--表名根目录为node,且必须含有to,from,等节点-->
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!-- #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>
2. Schema:一种复杂的约束技术(正在逐步取代DTD);
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
解析
操作XML文档,将其中数据读取到内存中;
解析方式
1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
* 优点:操作方便,可以对文档进行CRUD的所有操作
* 缺点:占内存
2.SAX:逐行读取,基于事件驱动的。
* 优点:不占内存。
* 缺点:只能读取,不能增删改
常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sax方式的。
Jsoup解析器
使用步骤
- 导入jar包;
- 获取Document对象;
- 获取对应的标签Element对象;
- 获取数据;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class D1 {
public static void main(String[] args) {
String path = D1.class.getClassLoader().getResource("T1.xml").getPath();
//获取配置xml文件的路径
Document parse = Jsoup.parse(new File(path),"utf-8");
//获取Document对象
Elements name = parse.getElementsByTag("name");
//获取元素
for (Element element : name) {
System.out.println(element);
}
}
}
对象的使用
Jsoup对象
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的文档对象
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 D1 {
public static void main(String[] args) throws IOException {
String path = D1.class.getClassLoader().getResource("T1.xml").getPath();
//获取配置xml文件的路径
Document parse = Jsoup.parse(new File(path),"utf-8");
String str="<?xml version='1.0'?>\n" +
"<?xml-stylesheet type=\"text/css\" href=\"T1.css\" ?>\n" +
"<users>\n" +
" <user id='1'>\n" +
" <name>zhangsan</name>\n" +
" <age>23</age>\n" +
" <gender>male</gender>\n" +
" <br/>\n" +
" </user>\n" +
"\n" +
" <user id='2'>\n" +
" <name>lisi</name>\n" +
" <age>24</age>\n" +
" <gender>female</gender>\n" +
" </user>\n" +
"</users>";
Document parse1 = Jsoup.parse(str);
System.out.println(parse1);
}
}
Document对象
Document:文档对象。代表内存中的dom树
返回值都是Elements(元素Element的集合对象)
=============
* 获取Element对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
演示
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 D2 {
/**
* Document对象方法
*
* @param args
*/
public static void main(String[] args) throws IOException {
String path = D2.class.getClassLoader().getResource("T1.xml").getPath();
Document parse = Jsoup.parse(new File(path), "utf-8");
Elements user = parse.getElementsByTag("user");
for(Element element:user)
System.out.println(element);
Elements sex = parse.getElementsByAttributeValue("sex","male");
for (Element element : sex) {
System.out.println(element);
}
}
}
Element:元素对象
1. 获取子元素对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合