什么是xml
XML 指可擴(kuò)展標(biāo)記語(yǔ)言(EXtensible Markup Language)
XML 是一種標(biāo)記語(yǔ)言省有,很類似 HTML
XML 的設(shè)計(jì)宗旨是傳輸數(shù)據(jù)痒留,而非顯示數(shù)據(jù)
XML 標(biāo)簽沒(méi)有被預(yù)定義。您需要自行定義標(biāo)簽蠢沿。
XML 被設(shè)計(jì)為具有自我描述性伸头。
XML 是 W3C 的推薦標(biāo)準(zhǔn)
html與xml區(qū)別
XML 不是 HTML 的替代。
XML 和 HTML 為不同的目的而設(shè)計(jì):
XML 被設(shè)計(jì)為傳輸和存儲(chǔ)數(shù)據(jù)舷蟀,其焦點(diǎn)是數(shù)據(jù)的內(nèi)容恤磷。
HTML 被設(shè)計(jì)用來(lái)顯示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀野宜。
HTML 旨在顯示信息扫步,而 XML 旨在傳輸信息。
HTML語(yǔ)法比較松散匈子,xml語(yǔ)法嚴(yán)格
HTML所有標(biāo)簽都是預(yù)先定義好的河胎, 使用固定的標(biāo)簽,展示不同的內(nèi)容
XML當(dāng)中的標(biāo)簽都是自己定義的
XML用處:
? 數(shù)據(jù)存儲(chǔ)
? 配置文件
? 數(shù)據(jù)傳輸
基本語(yǔ)法
文檔聲明
? 必須寫(xiě)在文檔的第一行
? 寫(xiě)法:<?xml version="1.0">
屬性
version版本號(hào)虎敦,固定1.0
encoding指定文檔的碼表 默認(rèn)iso-8859-1
standalone指定文檔是否獨(dú)立yes或no
是否可以引用其它文件
規(guī)則
所有 XML 元素都須有關(guān)閉標(biāo)簽
XML 標(biāo)簽對(duì)大小寫(xiě)敏感
XML 必須正確地嵌套
XML 文檔必須有根元素
XML 的屬性值須加引號(hào)
實(shí)體引用
在 XML 中游岳,一些字符擁有特殊的意義。
如果你把字符 "<" 放在 XML 元素中原茅,會(huì)發(fā)生錯(cuò)誤吭历,這是因?yàn)榻馕銎鲿?huì)把它當(dāng)作新元素的開(kāi)始。
這樣會(huì)產(chǎn)生 XML 錯(cuò)誤:
為了避免這個(gè)錯(cuò)誤擂橘,請(qǐng)用實(shí)體引用來(lái)代替 "<" 字符:
5 個(gè)預(yù)定義的實(shí)體引用
? < < 小于
? > > 大于
? & & 和號(hào)
? ' ' 單引號(hào)
? " " 引號(hào)
文本
轉(zhuǎn)義字符
CDATA
? 里面的數(shù)據(jù)會(huì)原樣顯示
? <![CDATA[數(shù)據(jù)內(nèi)容]]>
屬性
屬性值必須引用引起晌区,單雙都行
演示
?XML約束
什么是約束
規(guī)定文檔當(dāng)中只能寫(xiě)哪些標(biāo)簽。并且會(huì)給一些提示
約束分類
DTD約束
? 內(nèi)部dtd
? 在xml當(dāng)中定義的dtd
? 外部dtd
? 在外部文件當(dāng)中單獨(dú)定義的dtd
? 本地:<!DOCTYPE 名稱 SYSTEM "student.dtd"
? 網(wǎng)絡(luò):<!DOCTYPE students PUBLIC "命名空間" "student.dtd"
? 約束語(yǔ)法
?
? 學(xué)習(xí)要求
? 不要求自己寫(xiě)出來(lái)通贞,能看懂別人寫(xiě)的dtd約束
? 存在的問(wèn)題
? 在標(biāo)簽當(dāng)中存放的內(nèi)容不知道是什么類型朗若,寫(xiě)的都是漢字,這種約束不嚴(yán)謹(jǐn)
schema
復(fù)雜標(biāo)簽
標(biāo)簽當(dāng)中還有子標(biāo)簽
簡(jiǎn)單標(biāo)簽
標(biāo)簽當(dāng)中沒(méi)有子標(biāo)簽了
語(yǔ)法
type 起的別名
complexType name="students"
sequence
element name="" minOccur相當(dāng)于dtd的*
simpleTyle
restriction base="xsd:string" 限制簡(jiǎn)單標(biāo)簽當(dāng)中的數(shù)據(jù)類型
schema分析
使用過(guò)程
編寫(xiě)根標(biāo)簽
引用約束地址 xsi:schemaLocation="默認(rèn)空間 約束地址.xsd"
引用實(shí)例名稱空間 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
默認(rèn)名稱空間 xmlns="http://www.it666.cn/xml"
xml解析
XML文檔結(jié)構(gòu)
XML的樹(shù)結(jié)構(gòu)
?
使用一種方式來(lái)表示整個(gè)xml
結(jié)點(diǎn)
? 文檔結(jié)點(diǎn)
? 元素結(jié)點(diǎn)
? 屬性結(jié)點(diǎn)
? 文本結(jié)點(diǎn)
DOM
什么是DOM
? DOM:Document Object Model:文檔對(duì)象模型,把文檔中的成員描述成一個(gè)個(gè)對(duì)象.
? 使用Java代碼操作XML 或者 js代碼操作HTML
DOM解析的特點(diǎn)
? 在加載的時(shí)候,一次性的把整個(gè)XML文檔加載進(jìn)內(nèi)存,在內(nèi)存中形成一顆樹(shù)(Document對(duì)象).
? 以后使用代碼操作Document,其實(shí)操作的是內(nèi)存中的DOM樹(shù),和本地磁盤(pán)中的XML文件沒(méi)有直接關(guān)系.
? 由于操作的是內(nèi)存當(dāng)中的dom,磁盤(pán)中xml當(dāng)中的內(nèi)容并沒(méi)有變昌罩,要進(jìn)行同步哭懈,讓兩邊保持一致
? 查詢不需要同步,只有數(shù)據(jù)變化的時(shí)候茎用,才需要同步
? 缺點(diǎn):若XML文件過(guò)大,可能造成內(nèi)存溢出.
DOM解析步驟
? 1.創(chuàng)建解析器工廠
? 2.通過(guò)解析器工廠得到解析器
? 3.通過(guò)解析器得到document對(duì)象
? 4.獲取具體的節(jié)點(diǎn)內(nèi)容
DOM修改元素內(nèi)容
? 1.獲取所有指定節(jié)點(diǎn)
? 2.獲取要修改的節(jié)點(diǎn)
? 3.修改元素內(nèi)容
? 4.從內(nèi)存寫(xiě)到文檔做同步操作
DOM添加元素
? 1.創(chuàng)建一個(gè)節(jié)點(diǎn)
? 2.設(shè)置元素內(nèi)容
? 3.獲取要添加元素的父結(jié)點(diǎn)
? 4.添加節(jié)點(diǎn)
? 5.從內(nèi)存寫(xiě)到文檔做同步操作
DOM刪除元素
? 1.獲取一個(gè)節(jié)點(diǎn)
? 2.獲取該節(jié)點(diǎn)的父節(jié)點(diǎn)遣总,從父節(jié)點(diǎn)當(dāng)中移除
? 3.從內(nèi)存寫(xiě)到文檔做同步操作
? DOM添加元素屬性
? 1.獲取要添加屬性的節(jié)點(diǎn)
? 2.把獲取的節(jié)點(diǎn)強(qiáng)制轉(zhuǎn)換成element
? 3.設(shè)置屬性
? 4.從內(nèi)存寫(xiě)到文檔做同步操作
?
dom4j
Sax解析介紹
? 逐行讀取睬罗,基于事件驅(qū)動(dòng)
? 優(yōu)點(diǎn):不占內(nèi)存,速度快
? 缺點(diǎn):只能讀取旭斥,不能回寫(xiě)
? 解析流程
?
? DOM4j介紹
? DOM4J是dom4j.org出品的一個(gè)開(kāi)源XML解析包
? dom4j是一個(gè)十分優(yōu)秀的JavaXML API容达,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn)垂券,它的性能超過(guò)sun公司官方的dom技術(shù)花盐,同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件
? 越來(lái)越多的Java軟件都在使用dom4j來(lái)讀寫(xiě)XML,特別值得一提的是連Sun的JAXM也在用dom4j菇爪。這已經(jīng)是必須使用的jar包算芯, Hibernate也用它來(lái)讀寫(xiě)配置文件。
dom4j解析步驟
? 下載Dom4j的jar包
? 在工程根目錄當(dāng)中創(chuàng)建一個(gè)文件夾為lib
? 編譯jar包
? 創(chuàng)建SAXReader
? 讀取指定路徑的xml
獲取所有指定標(biāo)簽內(nèi)容
? 1.創(chuàng)建SAXReader
? 2.獲取根元素
? 3.根據(jù)名稱獲取根元素下的所有標(biāo)簽
? 4.遍歷每一個(gè)子元素
? 5.獲取指定名稱的元素
? 6.獲取標(biāo)簽當(dāng)中的文本
獲取全部標(biāo)簽內(nèi)容
? 1.創(chuàng)建SAXReader
? 2.獲取根元素
? 3.獲取根元素下所有的元素
? 4.遍歷每一個(gè)子元素
添加元素
? 1.創(chuàng)建SAXReader
? 2.獲取根元素
? 3.給根元素添加元素和屬性凳宙,并返回添加的元素
?
Writer wr = new OutputStreamWriter(new FileOutputStream("src/com/xml/dom4j/student.xml"),"UTF-8");
doc.write(wr);
wr.close();
//pretty print the document to System.out 美化dom4j傳輸xml 固定死的代碼,文件回寫(xiě)
OutputFormat format = OutputFormat.createPrettyPrint();
Writer wr = new OutputStreamWriter(new FileOutputStream("src\\xml\\student.xml"),"UTF-8");
XMLWriter writer = new XMLWriter(wr,format);
writer.write(doc);
wr.close();//必須要關(guān)閉