XML
XML,Extensible Markup Language,可扩展标记语言。
功能:
存储数据,可作为配置文件、在网络中传输
语法
语法:
XML第一行第一列是文档声明
XML文档有且仅有一个根标签
XML标签属性值必须使用单引号或者双引号标识
XML标签必须正确关闭
XML标签名称区分大小写
CDATA区
<![CDATA[文本内容]]>
组成部分:
文档声明
<?xml 属性列表?>
version,版本号,必要属性
encoding,编码方式,默认值,ISO-8859-1
standalone,独立性,yes,独立,no,非独立
XML元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。XML的标签均为自定义的。
XML 标签命名规则:
- 名称可以含字母、数字以及其他的字符(包括英文字符等字符)
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词。
XML属性
XML 元素可以在开始标签中包含属性,类似 HTML。属性 (Attribute) 提供关于元素的额外(附加)信息。XML 属性必须加引号XML属性值必须被单引号或双引号包围。
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
id属性唯一
XML约束
DTD、XSD XML Schemas Definition
DTD:
引入dtd文档到xml文档中
内部dtd:将约束规则定义在xml文档中
外部dtd:将约束的规则定义在外部的dtd文件中
本地:
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
网络:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
示例DTD
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.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="test_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="test_002">
<name>mike</name>
<age>19</age>
<sex>male</sex>
</student>
</students>
填写xml文档的根元素
引入xsi前缀. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“
引入xsd文件命名空间. xsi:schemaLocation=”http://www.zr.cn/xml student.xsd”
为每一个xsd约束声明一个前缀,作为标识 xmlns=”http://www.zr.cn/xml“
xmlns:a=”http://www.zr.cn/xml“
xmlns:b=”http://www.zr.cn/xml2“
在后面使用标签时,如果两个名字的文件都有相同的那个标签,则可以通过<a:标签名>来实现*
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.zr.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.zr.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="heima_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.zr.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.zr.cn/xml"
xmlns:a="http://www.zr.cn/xml"
xmlns:b="http://www.zr.cn/xml2"
在后面使用标签时,如果两个名字的文件都有相同的那个标签,则可以通过<a:标签名>来实现
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.zr.cn/xml student.xsd"
xmlns="http://www.zr.cn/xml"
>
<student number="heima_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
XSD是指XML结构定义 ( XML Schemas Definition )XML Schema 是DTD的替代品。XML Schema语言也就是XSD。XML Schema描述了XML文档的结构。可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XML Schema指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。
解析器
XML解析
将XML文档中的数据读取至内存中。
解析方式
DOM解析方式,一次性加载XML文件至内存形成DOM树,可以对文档进行CRUD操作。
SAX解析方式,simple API for XML,逐行加载XML文件至内存,边扫描边解析。
XML解析器
JAXP:sun公司提供的解析器,支持dom和sax解析方式。
DOM4J:dom解析方式。
Jsoup:dom解析方式。
PULL:Android内置XML解析器,sax解析方式。
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的文档对象
Document:文档对象。代表内存中的dom树,获取Element对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
Elements:元素Element对象的集合。可以当做 ArrayList
Element:元素对象
获取子元素对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
获取属性值
- String attr(String key):根据属性名称获取属性值
获取文本内容
String text():获取文本内容
String html():获取标签体的所有内容(包括字标签的字符串内容)
Node:节点对象,是Document和Element的父类
selector选择器
Elements select(String cssQuery),cssQuery按照以前css选择器名字来做
Xpath
利用JsoupXpath,XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言,需要Jsoup的支持。
XML解析示例
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="student0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
<grade>
<class th="chiness">100</class>
<class th="math">98</class>
<class th="english">99</class>
</grade>
</student>
<student number="student0002">
<name>jack</name>
<age>14</age>
<sex>female</sex>
</student>
</students>
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class JsoupTest {
public static void main(String[] args) throws IOException {
//获取xml文件的路径
String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
//解析xml文档
Document document = Jsoup.parse(new File(path),"UTF-8");
//获取xml文档中的元素对象
System.out.println("---dom方式获取文档内容");
Elements elements = document.getElementsByTag("class");
//遍历对象获取数据
for(Element element : elements){
System.out.println(element);
}
System.out.println("---选择器方式获取文件内容");
elements = document.select("student[number='student0001'] > age");
System.out.println(elements);
System.out.println("---Xpath解析文件内容");
JXDocument jxDocument = new JXDocument(document.getAllElements());
List<JXNode> jxNodes = jxDocument.selN("//student//class");
for(JXNode jxNode : jxNodes){
System.out.println(jxNode);
}
}
}