XML基礎語法
和html超文本語言一樣,只不過xml主要作用是存儲數據,和配置文件作用
xml創建
<?xml version="1.0" encoding="UTF-8" ?> //必寫,定義xml版本和編碼格式
<!DOCTYPE students SYSTEM "student.dtd">//約束的一種(這是dtd約束),還有一種是schema約束
<students>
<student number="s0001">
<name>zs</name>
<age>abc</age>
<sex>yao</sex>
</student>
</students>
DTD約束
DTD語法簡單,但是約束力不強,如性別只能男和女這些不能約束
<!ELEMENT students (student*) > //開頭第一個定義根元素,唯一!
<!ELEMENT student (name,age,sex)>//students的子元素,其中student下有name,age,sex子標籤
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> //創建屬性number在student中,並且必需,和不能重複!
schema約束
schema語法難,約束力強大,在框架的配置中經常用到
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml" //命名空間 xml在引用約束的地址,隨便寫,不過一般用網址名稱
xmlns:xsd="http://www.w3.org/2001/XMLSchema" //名稱空間 有了命名空間可以直接使用<xsd XXX>來使用不同schema約束文件的,簡化格式。
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"//引入shema約束,名稱空間 實際地址
<xsd:element name="students" type="studentsType"/> //定義元素,type就當是id的意思
<xsd:complexType name="studentsType"> //給type叫studentsType的標籤進行描述
<xsd:sequence> //序列,標籤順序
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>//最小0,最大無界
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType"> //給type叫studentsType的標籤進行描述
<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"> //給type叫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="itcast_\d{4}"/> //正則:必需是itcast_4個數字格式
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
xmlns:XXX 名稱空間
標籤<XXX:name>使用XXX約束的name元素(可以把XXX取消掉,直接用<name>元素,如果約束過多,還是帶上<XXX:name>)
xsi:schemaLocation 引用schema地址,格式 名稱空間 空格 命名空間(本地或者網絡)
XML解析
無非是讀,寫
DOM:將文檔加載內存,形成一顆dom樹,將文檔的各個組成部分封裝成對象
優點:在內存形成dom樹,可以對dom進行增刪改查
缺點:dom佔內存,過大xml速度會慢
Document
Element
Text
Attribute
Comment
SAX:逐行讀取,基於事件驅動
優點:不佔內存,速度快
缺點:只能讀取,不能回寫
startDocument
startElement
characters
endElement
endDocument
XML常用的解析器:
JAXP:sun公司提供的,支持dom和sax(sun公司自己都不用···)
JDOM:創建後分家,就出現底下那個
DOM4J:dom for java民間方式,非常好。支持dom
1.導入jar包dom4j.jar
2.創建解析器
SAXReader reader =new SAXReader();
3.解析xml獲取document對象
Document document=reader.read(url);
DOM4j:
dom4j教程看:https://dom4j.github.io/(簡單哦了)
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);//把xml加載dom到內存中
return document;//返回document對象
}
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();//獲得根節點
// iterate through child elements of root 遍歷root的子節點
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { //這種寫法我挺支持的Iterator寫在裏面,用完就銷燬。是個好技巧
Element element = it.next();
// do something
}
// iterate through child elements of root with element name "foo"
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
// do something
}
// iterate through attributes of root
for (Iterator<ttribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next(); //獲得屬性
// do something
}
}
public void treeWalk(Element element) {//遞歸xml遍歷出所有的元素
System.out.println(element.getName);
for (int i = 0, i<element.nodeCount();i++) {
Node node = element.node(i);
if (node instanceof Element) {//判斷是否是Element,是就遞歸,繼續遍歷元素裏面的元素
treeWalk((Element) node);
}
}
}
1.引入jaxen-1.1.6.jar
2.document.方法:
selectSingleNode("/書架/書[1]/書名") //尋找元素帶書架下的第一個書元素的書名元素
selectNodes("//*") //遍歷所有的標籤,比dom4j的遞歸遍歷簡單多了
//爲根目錄下並且忽略深度,*代表所有元素
//@id 忽略深度匹配屬性<bbb id="b1"/>
//BBB[@id] 忽略深度匹配BBB元素帶id屬性的元素
//BBB[not(@*)] 忽略深度匹配BBB元素不帶屬性的元素