XML(Extensible Markup Language):可扩展标记语言
可扩展:标签都是自定义的。
HTML和XML都是W3C(万维网联盟)制定的标准,最开始HTML的语法过于松散,于是W3C制定了更严格的XML语法标准,希望能取代HTML。但是程序员和浏览器厂商并不喜欢使用XML,于是现在的XML更多的用于配置文件及传输数据等功能。
是谁造成的HTML语法松散?
浏览器厂商。最开始W3C制定HTML的时候语法还是比较严格的。但浏览器厂商为了抢占市场,语法错误也可以解析成功HTML,最后“内卷”到HTML即使语法非常混乱也是可以被浏览器解析。
tips:归根到底是语法的制定者和使用者不一致造成了HTML语法混乱,JAVA语法严格就是因为java语言的运行工具java虚拟机也是sun公司(现在是oracle)出品的,语法不通过不让运行。
为什么程序员不使用XML写前端页面?
因为程序员松散惯了,不想写很严格的代码。同样挣一万块钱,谁会从每月上一天班的公司跳槽到996的公司呢?
配置文件:在今后的开发过程当中我们会频繁使用框架(框架:半成品软件),使用框架时,需要写配置文件配置相关的参数,让框架满足我们的开发需求。而我们写的配置文件中就有一种文件类型是XML。
日后编写大型项目,不可能从头到尾都是原创代码,很多功能前人已经写好,我们只需要使用前人写好的半成品软件(框架),再加入一些符合我们需求的配置即可完成开发。
传输数据:在网络中传输数据时并不能传输java对象,所以我们需要将JAVA对象转成字符串传输,其中一种方式就是将对象转为XML类型的字符串。
比如携程等旅游网站可以买火车票,但他们其实也是替12306卖票,此时他们就需要拿到12306的票务数据。JAVA对象不能在网络上传输,可以转为XML类型的字符串。
文档声明必须放在第一行,格式为:
属性列表:
- version:版本号(必须)
- encoding:编码方式
XML中标签名是自定义的,标签名有以下要求:
指令是结合css使用的,但现在XML一般不结合CSS,语法为:
属性值必须用引号(单双都可)引起来
如果想原样展示文本,需要设置CDATA区,格式为:
虽然XML标签是自定义的。但是作为配置文件时,也需要遵循一定的规则。就比如在主板上硬盘口只能插硬盘,不能插入其他硬件。约束就是定义XML书写规则的文件,约束我们按照框架的要求编写配置文件。
我们作为框架的使用者,不需要会写约束文件,只要能够在xml中引入约束文档,简单的读懂约束文档即可。XML有两种约束文件类型:DTD和Schema。
DTD是一种较简单的约束技术,引入方式如下:
本地引入:
网络引入:
student.dtd
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
student.xml
DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="bz001">
<name>javaBoyname>
<age>10age>
<sex>男sex>
student>
students>
Schema比DTD对XML的约束更加详细,引入方式如下:
写xml文档的根标签
引入xsi前缀:确定Schema文件的版本。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
引入Schema文件
xsi:schemaLocation="Schema文件定义的命名空间 Schema文件的具体路径"
为Schema约束的标签声明前缀
xmlns:前缀="Schema文件定义的命名空间"
XML解析即读写XML文档中的数据。框架的开发者通过XML解析读取框架使用者配置的参数信息,开发者也可以通过XML解析读取网络传来的数据。XML有如下解析思想:
将标记语言文档一次性加载进内存,在内存中形成一颗dom树
逐行读取,基于事件驱动的。
步骤:
public class Demo1 {
// 获取XML中所有学生的姓名
public static void main(String[] args) throws IOException {
// 2.加载XML文档进内存。获取DOM树对象Document
// 2.1 获取类加载器
ClassLoader classLoader = Demo1.class.getClassLoader();
// 2.2使用类加载器,找到XML文档的路径
String path = classLoader.getResource("com/java/xsd/student.xml").getPath();
// 2.3加载XML文档进内存,并转成Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.获取对应的标签Element对象
Elements name = document.getElementsByTag("name");
// 4.获取数据
for (Element element : name) {
String text = element.text();
System.out.println(text);
}
}
}
Jsoup:可以解析xml或html,形成dom树对象。
常用方法:
static Document parse(File in, String charsetName)
:解析本地文件static Document parse(String html)
:解析html或xml字符串static Document parse(URL url, int timeoutMillis)
:解析网页源文件public class Demo2 {
// Jsoup
public static void main(String[] args) throws IOException {
// 解析本地XML
String path = Demo2.class.getClassLoader().getResource("com/java/xsd/student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
System.out.println(document);
System.out.println("------------------");
// 解析网络资源
Document document2 = Jsoup.parse(new URL("https://www.baidu.com"), 2000);
System.out.println(document2);
}
}
Document:xml的dom树对象
常用方法:
Element getElementById(String id)
:根据id获取元素Elements getElementsByTag(String tagName)
:根据标签名获取元素Elements getElementsByAttribute(String key)
:根据属性获取元素Elements getElementsByAttributeValue(String key,String value)
:根据属性名=属性值获取元素。Elements select(Sting cssQuery)
:根据选择器选取元素。Element: 元素对象
常用方法:
String text()
:获取元素包含的纯文本。String html()
:获取元素包含的带标签的文本。String attr(String attributeKey)
:获取元素的属性值。XPath即为XML路径语言,它是一种用来确定标记语言文档中某部分位置的语言。
使用方法:
Xpath
的jar包Document
对象Document
对象转为JXDocument
对象JXDocument
调用selN(String xpath)
,获取List
对象。List
,调用JXNode
的getElement()
,转为Element
对象。Element
对象。