XML:(Extensible Markup Language)可扩展标记语言
可扩展:标签都是自定义的。
功能:存储数据,可做配置文件,或者在网络中传输
XML和HTML的区别(引用于https://www.cnblogs.com/jqant/p/9497838.html)
1. 在html中不区分大小写,在xml中严格区分。
2. 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
6. 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。
1.xml后缀名为.xml
2.xml第一行必须定义为文档声明(例如:<?xml version='1.0' ?> <!--文档声明-->),xml严格识别空格,第一行指绝对的第一行,否则无法解析。
3.xml文档中有且仅有一个根标签
4.属性值必须使用引号引起来
5.标签必须有结束标签
6.XML严格区分大小写
必须定义在第一行
格式<?xml 属性列表 ?>
属性列表:
version:版本号,必须属性
encoding:编码方式,告诉浏览器用什么编码解析,文本编辑器的编码格式应与encoding的解码格式相同,其中,高级的开发工具如eclipse或者idea等等,会自动修改文本编辑器的编码方式。
standalone:是否独立,指文件不依赖于其他的文件。standalone="yes" standalone="no",主要用于约束,但是实际上现在很少使用了。
可以使用CSS样式,用来展示数据(但是实际上现在XML很少用于展示数据)
<?xml-stylesheet type="text/css" href="a.css" ?>
加上了这条语句页面就会用于展示而浏览器不再显示XML的树状结构
规则:
如果XML文档中的内容出现了一些特殊字符,需要转义
如
<code> if(a < b && a > c){do something} </code>
会直接报错,其中< >需要转义
<code>
if(a < b && a > c){do something}
</code>
CDATA区,在该区域的数据会被原样展示,无需转义
<code>
<![CDATA[
if(a < b && a > c){do something}
]]>
</code>
软件的用户编写软件读取的XML,以供软件解析。同时软件应提供XML的约束规定书写规则。
dtd好像无法约束实体的内容。。。
1.数据类型
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
2.内部的DTD声明
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#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>
3.外部的DTD引用
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">
这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
这是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
schema的作用
schema相对dtd的优势
schema元素有类型区分
对元素的限定方法可通过比较区间进行限定
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
也可以通过枚举进行限定
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
通过正则限定
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
示例代码
XML
<?xml version='1.0' encoding="GBK" ?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsdtest.xsd">
<user id="1">
<name>张三</name>
<age>23</age>
<gender>male</gender>
<code>
<![CDATA[
if(a < b && a > c){do something}
]]>
</code>
</user>
<user id="2">
<name>LiSi</name>
<age>24</age>
<gender>famale</gender>
</user>
</users>
DTD
<?xml version="1.0" encoding="gbk" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="users">
<xs:complexType>
<xs:sequence>
<xs:element name="user" type="xs:complexType" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="user">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="age" type="xs:string"></xs:element>
<xs:element name="gender" type="xs:string"></xs:element>
<xs:element name="code" type="xs:string"></xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" default="0"/>
</xs:complexType>
</xs:element>
<xs:attribute name="id" type="xs:integer"/>
</xs:schema>
额外注意,attribute的内容必须放置在最后,否则报错。
解析XML的方式:
将标记语言文档一次性加载进入内存,在内存中会形成一颗DOM树
优点是操作方便,可以对文档进行C(reate)R(etrieve)U(pdate)D(elete)的所有操作
缺点是占用内存较多。
逐行读取,基于事件驱动
优点是及时释放内存资源
缺点是不能CRUD
步骤:
1:导入jar包
2:获取document对象
3:获取对应的标签element对象
4:获取数据
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 jsoupDemo {
public static void main(String[] args) throws IOException {
//获取document对象,根据xml文档获取
//获取XML的path
String path = jsoupDemo.class.getClassLoader().getResource("users.xml").getPath();
//加载文档进内存,并获取DOM树
Document document = Jsoup.parse(new File(path),"utf-8");
//获取元素对象
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//获取第一个element元素
Element element = elements.get(0);
System.out.println(element.text());
}
}
jsoup的常见对象:
1.Jsoup:工具类,可以解析HTML或者XML,返回Document对象
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.net.URL;
public class jsoupDemo {
public static void main(String[] args) throws IOException {
//获取document对象,根据xml文档获取
//获取XML的path
String path = jsoupDemo.class.getClassLoader().getResource("users.xml").getPath();
Document document = Jsoup.parse(new URL(new String("http://www.baidu.com")),2000);
System.out.println(document);
}
}
2.Document:文档对象,内存中的DOM树
3.Elements:Element对象的集合,类似于ArrayList<Element>
4.Element:元素对象
5.Node:节点对象
快捷查询
1.selector:
使用的方法:Elements select(String cssQuery)
2.Xpath:
https://www.w3school.com.cn/xpath/xpath_syntax.asp
Xpath为XML路径语言
使用Jsoup的Xpath需要额外导入jar包
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。