1. xml标签都是自定义的,html标签是预定义。
2. xml的语法严格,html语法松散
3. xml是存储数据的,html是展示数据
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明
3. xml文档中有且仅有一个根标签
4. 属性值必须使用引号(单双都可)引起来
5. 标签必须正确关闭(可以自闭合)
6. xml标签名称区分大小写
//必须是真正意义上的第一行
<users>//根标签
<user id='1'>
<name>zhangsanname>
<age>23age>
<gender>malegender>
<br/>
user>
<user id='2'>
<name>lisiname>
<age>24age>
<gender>femalegender>
user>
users>
解析:
1. version:版本号,必须的属性
2. encoding:编码方式。告知解析引擎当前文档使用的字符集,
* 默认值:ISO-8859-1
3. standalone:是否独立
* yes:不依赖其他文件
* no:依赖其他文件
<?xml-stylesheet type="text/css" href="a.css" ?>
1. 名称可以包含字母、数字以及其他的字符
2. 名称不能以数字或者标点符号开始
3. 名称不能以字母 xml(或者 XML、Xml 等等)开始
4. 名称不能包含空格
<![CDATA[if(a>b && c>b)]]>
/*
html和xml中有很多特殊字符是无法显示的,要用实体编号
举个栗子(注意分号):
空格 空格
< 小于 <
> 大于 >
& &符号 &
" 双引号 "
CDATA区里面的数据则可以直接显示
*/
图解:
我们知道框架是半成品软件,而程序员通过编写xml给软件解析,相当于把人的语言装换为计算机语言告诉框架:我们想做什么!
但是!:xml的特点是可以自定义标签,那么人家半成品软件怎么知道你的标签是什么?所以才有了约束。
约束就是半成品软件编写的规定了程序员使用它的规则是一份说明文档。
概念:规定xml文档书写的规则
* 作为框架使用者(要求):
1. 能够在xml中引入约束文档
2. 能够简单的读懂约束文档
分类:
- DTD:
* 引入dtd文档到xml文档中
* 内部dtd:将约束规则定义在xml文档中
* 外部dtd:将约束的规则定义在外部的dtd文件中
* 本地:
* 网络:
内部dtd栗子:
DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="itcast_0001">
<name>tomname>
<age>18age>
<sex>malesex>
student>
students>
外部dtd栗子:
DOCTYPE students [
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
<students>
<student number="fL_01">
<name>tomname>
<age>18age>
<sex>malesex>
student>
students>
约束文档具体书写规则参考
- Schema:
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
3.引入xsd文件命名空间. xsi:schemaLocation=“http://www.itcast.cn/xml student.xsd”
4.为每一个xsd约束声明一个前缀,作为标识 xmlns=“http://www.itcast.cn/xml”
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
<student number="fL_01">
<name>tomname>
<age>18age>
<sex>malesex>
student>
<student number="fL_02">
<name>jackname>
<age>18age>
<sex>malesex>
student>
students>
Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL 地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
快速入门:
1. 导入jar包
2. 获取Document对象
3. 获取对应的标签Element对象
4. 获取数据
//这里用的xml就是上面的student.xml;
public class jDemo1 {
//导入的是jsoup的jar包
public static void main(String[] args) throws IOException {
//1.根据xml文档获取document对象
//2.1获取student.xml的path
String path = jDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档,加载文档进内存
Document document = Jsoup.parse(new File(path), "utf-8");
//3获取element对象进内存
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个名为name的elements对象
//注:这里的更多操作可以查看javaEE文档
Element element = elements.get(0);
//3.2获取数据
String name = element.text();
System.out.println(name);
}
}
Maven:各种jar包下载官网
对象的使用:
1. 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的文档对象
2. Document:文档对象。代表内存中的dom树
* 获取Element对象:
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
3. Elements:元素Element对象的集合。可以当做 ArrayList来使用
4. Element:元素对象:
(1) 获取子元素对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
(2)获取属性值
* String attr(String key):根据属性名称获取属性值
(3)获取文本内容
* String text():获取文本内容
* String html():获取标签体的所有内容(包括字标签的字符串内容)
5. Node:节点对象
* 是Document和Element的父类
/*
tom
18
male
jack
18
male
*/
//1.获取student.xml的path
String path = JsoupDemo5.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.查询name标签
Elements elements = document.select("name");
System.out.println(elements);
System.out.println("=----------------");
//4.查询id值为01的元素
Elements elements1 = document.select("#01");
System.out.println(elements1);
System.out.println("----------------");
//5.获取student标签并且number属性值为fL_01的age子标签
//5.1.获取student标签并且number属性值为fL_01
Elements elements2 = document.select("student[number=\"fL_01\"]");
System.out.println(elements2);
System.out.println("----------------");
//5.2获取student标签并且number属性值为fL_01的age子标签
Elements elements3 = document.select("student[number=\"fL_01\"] > age");
System.out.println(elements3);
*/
//导入jar包
public class JsoupDemo6 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1.获取student.xml的path
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据document对象,创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
//4.1查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.2查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.3查询student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.4查询student标签下带有id属性的name标签 并且id属性值为01
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='01']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
}
更详细的xml解析和查询操作需要查询javaEE和w3c文档