您好,登錄后才能下訂單哦!
這輩子沒辦法做太多事情所以每一件都要做到精彩絕倫
People can't do too many things in my life,so everything will be wonderful
本文檔參考資料w3cschool.CHM API教程文檔免費下載地址http://down.51cto.com/data/2300287
XML 指可擴(kuò)展標(biāo)記語言EXtensibleMarkup Language
XML 是一種標(biāo)記語言很類似 HTML
XML 的設(shè)計宗旨是傳輸數(shù)據(jù)而非顯示數(shù)據(jù)
XML 標(biāo)簽沒有被預(yù)定義。您需要自行定義標(biāo)簽。
XML 被設(shè)計為具有自我描述性。
XML 是 W3C 的推薦標(biāo)準(zhǔn)
html和xml的區(qū)別
html超文本標(biāo)記語言。它主要是用來封裝頁面上要顯示的數(shù)據(jù)最后通過瀏覽器來解析html文件然后把數(shù)據(jù)展示在瀏覽器上。同樣我們可以使用JS和DOM技術(shù)對html文件進(jìn)行解析和操作。
xml可擴(kuò)展的標(biāo)記語言。它早期是為了代替html技術(shù)但是由于html書寫的網(wǎng)頁在全球占有率太高最后沒有成功。
后期我們開始使用xml文件作為軟件的配置文件或者數(shù)據(jù)的存儲文件以及傳輸數(shù)據(jù)的文件。
存儲和傳輸復(fù)雜的關(guān)系模型數(shù)據(jù)
在軟件系統(tǒng)中作為配置文件使用主要用途
為提高系統(tǒng)的靈活性它所啟動的模塊通常由其配置文件決定
例如一個軟件在啟動時它需要啟動、兩個模塊而A、這兩個模塊在啟動時又分別需要A1、A2和B1、B2模塊的支持為了準(zhǔn)確描述這種關(guān)系此時使用文件最為合適不過。
一個XML文件分為如下幾部分內(nèi)容
文檔聲明
元素
屬性
注釋
CDATA區(qū) 、特殊字符
處理指令processing instruction
l 在編寫XML文檔時需要先使用文檔聲明聲明XML文檔的類型。也就是告訴其他解析軟件該文檔是個XML文檔。
l 最簡單的聲明語法
<?xmlversion="1.0" ?>
l 用encoding屬性說明文檔的字符編碼經(jīng)常使用的
<?xmlversion="1.0" encoding="UTF-8" ?>
l 用standalone屬性說明文檔是否獨立
<?xmlversion="1.0" encoding=" UTF-8" standalone="yes" ?>
拖入瀏覽器解析
注意如果使用記事本編輯的話會解析錯誤中文亂碼問題。只是使用記事本編輯的時候會出現(xiàn)其原因如下
l 常見錯誤
1. <?xml version=1.0 ?> 屬性沒加引號
2. <?xml version=“1.0” ?> 全角空格
3.編碼錯誤
XML元素指XML文件中出現(xiàn)的標(biāo)簽一個標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽一個標(biāo)簽有如下幾種書寫形式例如
包含標(biāo)簽體<a>wyait.blog.51cto.com/</a>
不含標(biāo)簽體的<a></a>,簡寫為<a/>
一個標(biāo)簽中也可以嵌套若干子標(biāo)簽。但所有標(biāo)簽必須合理的嵌套絕對不允許交叉嵌套例如
<a>welcometo <b> wyait.blog.51cto.com/</a></b>
格式良好的XML文檔必須有且僅有一個根標(biāo)簽其它標(biāo)簽都是這個根標(biāo)簽的子孫標(biāo)簽。
對于XML標(biāo)簽中出現(xiàn)的所有空格和換行XML解析程序都會當(dāng)作標(biāo)簽內(nèi)容進(jìn)行處理。例如下面兩段內(nèi)容的意義是不一樣的。
第一段
<網(wǎng)址> wyait.blog.51cto.com</網(wǎng)址>
第二段
<網(wǎng)址>
wyait.blog.51cto.com
</網(wǎng)址>
由于在XML中空格和換行都作為原始內(nèi)容被處理所以在編寫XML文件時使用換行和縮進(jìn)等方式來讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。
命名規(guī)范
一個XML元素可以包含字母、數(shù)字以及其它一些可見字符但必須遵守下面的一些規(guī)范
區(qū)分大小寫例如<P>和<p>是兩個不同的標(biāo)記。
不能以數(shù)字開頭
不能包含空格
名稱中間不能包含冒號: --- Schema約束沖突
不建議"_"(下劃線)開頭
一個標(biāo)簽可以有多個屬性每個屬性都有它自己的名稱和取值例如
<inputtype=“text”>
屬性值一定要用雙引號"或單引號'引起來
定義屬性必須遵循與標(biāo)簽相同的命名規(guī)范
在XML技術(shù)中標(biāo)簽屬性所代表的信息也可以被改成用子元素的形式來描述例如
<input><type>text</type></input>
Xml文件中的注釋采用“<!--注釋-->”格式。
注意
XML聲明之前不能有注釋
注釋不能嵌套例如
<!--大段注釋
……
<!--局部注釋-->
……
-->
在編寫XML文件時有些內(nèi)容可能不想讓解析引擎解析執(zhí)行而是當(dāng)作原始內(nèi)容處理。
遇到此種情況可以把這些內(nèi)容放在CDATA區(qū)里對于CDATA區(qū)域內(nèi)的內(nèi)容XML解析程序不會處理而是直接原封不動的輸出。
語法<![CDATA[ 內(nèi)容 ]]>
<![CDATA[
<wyait>
<br/>
</wyait >
]]>
<demo>
<!--
當(dāng)我們希望把一些文本原樣的顯示在瀏覽器中時
可以使用xml中提供的cdata區(qū)域
格式
<![CDATA[需要原樣顯示的數(shù)據(jù)]]>
由于CDATA區(qū)域書寫麻煩可以使用特殊字符
< <
> >
-->
<![CDATA[
<h2>在html表示的是標(biāo)題標(biāo)簽
<br>在html表示換行
]]>
<h2>在html表示的是標(biāo)題標(biāo)簽
</demo>
l 對于一些單個字符若想顯示其原始樣式也可以使用轉(zhuǎn)義的形式予以處理。
常見的XML轉(zhuǎn)義字符記錄如下:
空格: <string name="out_bound_submit">出  庫</string> 其中的 就代表空格!解析的時候,空格還是空格!
換行: <string name="hello_world">你好!\n世界!</string> 其中的\n就代表換行
縮進(jìn): <string name="hello_world">你好!\t世界!</string> 其中的\t就代表按一次Tab鍵的幾個空格
應(yīng)當(dāng)注意,由于系統(tǒng)定義的基本的縮進(jìn)的格數(shù)不同,有的代表4個半角字符,有的代表8個半角字符, 所以可能顯示時效果不同。
如果在xml配置中使用了換行、空格、縮進(jìn)等,解析的時候會把換行、空格、縮進(jìn)解析為\n、 空格、\t等轉(zhuǎn)義字符!如下:
解析的時候:
代碼中會導(dǎo)致,本身配置的放行路徑,結(jié)果沒有放行!
處理指令簡稱PI processinginstruction。處理指令用來指揮解析引擎如何解析XML文檔內(nèi)容。
例如在XML文檔中可以使用xml-stylesheet指令通知XML解析引擎應(yīng)用css文件顯示xml文檔內(nèi)容。 <?xml-stylesheettype="text/css" href="1.css"?>
處理指令必須以“<?”作為開頭以“?>”作為結(jié)尾XML聲明語句就是最常見的一種處理指令。
l 所有XML 元素都須有關(guān)閉標(biāo)簽
l XML 標(biāo)簽對大小寫敏感
l XML 必須正確地嵌套順序
l XML 文檔必須有根元素(只有一個)
l XML 的屬性值須加引號
l 特殊字符必須轉(zhuǎn)義--- CDATA
l XML 中的空格、回車換行會解析時被保留
什么是XML約束
在XML技術(shù)里可以編寫一個文檔來約束一個XML文檔的書寫規(guī)范這稱之為XML約束。
為什么需要XML約束
常用的約束技術(shù)
XML DTD
XML Schema XSD
DTD的快速入門
1、先創(chuàng)建一個xml文件
2、書寫一個DTD文件
dtd文件的擴(kuò)展名必須是dtd
在xml中有多少個標(biāo)簽在dtd中就書寫多少個ELEMNT
3、在xml文件中導(dǎo)入DTD的約束
DTD和xml文件的結(jié)合方式
使用內(nèi)部DTD
可以把dtd和xml書寫在同一個文件中
<!DOCTYPE 根標(biāo)簽名 [
寫dtd的約束
] >
XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件DOCTYPE聲明語句有兩種形式
當(dāng)引用的文件在本地時外部DTD采用如下方式
<!DOCTYPE文檔根結(jié)點 SYSTEM "DTD文件的URL">
例如 <!DOCTYPE books SYSTEM“book.dtd”>。在xml文件中手寫一下。
l 當(dāng)引用的文件是一個公共的文件時公共DTD采用如下方式
<!DOCTYPE文檔根結(jié)點 PUBLIC "DTD名稱" "DTD文件的URL">
例如<!DOCTYPE web-app PUBLIC
"-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
在DTD中使用 ELEMENT 聲明當(dāng)前xml中可以出現(xiàn)的標(biāo)簽名稱 () 限制當(dāng)前這個標(biāo)簽中的文本或者子標(biāo)簽。
告訴我們 當(dāng)前的xml中可以有一個 books 標(biāo)簽在這個books標(biāo)簽下可以有一個或多個book子標(biāo)簽。
+ 當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)一次或多次
當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)零次或一次
* 當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)零次或多次
括號中的逗號是在定義出現(xiàn)的子標(biāo)簽的順序。
當(dāng)前這個name標(biāo)簽中可以書寫文本
<!ATTLIST 標(biāo)簽名
屬性名 屬性類型 屬性約束
屬性名 屬性類型 屬性約束
...
>
當(dāng)前book標(biāo)簽上有一個abc屬性這個屬性的值是一個文本但是這個必須是必須書寫的不能省略。
相關(guān)標(biāo)簽參考
XML Schema是用一套預(yù)先規(guī)定的XML元素和屬性創(chuàng)建的這些元素和屬性定義了XML文檔的結(jié)構(gòu)和內(nèi)容模式。 XML Schema規(guī)定XML文檔實例的結(jié)構(gòu)和每個元素/屬性的數(shù)據(jù)類型
Schema相對于DTD的明顯好處是XMLSchema文檔本身也是XML文檔而不是像DTD一樣使用自成一體的語法
Schema和DTD區(qū)別
XML從SGML中繼承了DTD并用它來定義內(nèi)容的模型驗證和組織元素。同時它也有很多局限
DTD不遵守XML語法
DTD不可擴(kuò)展
DTD不支持命名空間的應(yīng)用
DTD沒有提供強大的數(shù)據(jù)類型支持只能表示很簡單的數(shù)據(jù)類型。
Schema完全克服了這些弱點使得基于Web的應(yīng)用系統(tǒng)交換XML數(shù)據(jù)更為容易。下面是它所展現(xiàn)的一些新特性
Schema完全基于XML語法不需要再學(xué)習(xí)特殊的語法
Schema能用處理XML文檔的工具處理而不需要特殊的工具
Schema大大擴(kuò)充了數(shù)據(jù)類型支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等
Schema支持原型也就是元素的繼承。如我們定義了一個“聯(lián)系人”數(shù)據(jù)類型然后可以根據(jù)它產(chǎn)生“朋友聯(lián)系人”和“客戶聯(lián)系”兩種數(shù)據(jù)類型
Schema支持屬性組。我們一般聲明一些公共屬性然后可以應(yīng)用于所有的元素屬性組允許把元素、屬性關(guān)系放于外部定義、組合
開放性。原來的DTD只能有一個DTD應(yīng)用于一個XML文檔現(xiàn)在可以有多個Schema運用于一個XML文檔。
XML Schema 文件自身就是一個XML文件但它的擴(kuò)展名通常為.xsd
和XML文件一樣一個XMLSchema文檔也必須有一個根結(jié)點但這個根結(jié)點的名稱為Schema
應(yīng)用schema約束 開發(fā)xml 過程
W3C預(yù)先定義元素和屬性-àSchema文檔模式文檔約束文檔-àXML文檔實例文檔
編寫了一個XMLSchema約束文檔后通常需要把這個文件中聲明的元素綁定到一個地址上這個URI地址叫namespace名稱空間以后XML文件就可以通過這個URI即名稱空間引用綁定指定名稱空間的元素
XML Schema文檔基本結(jié)構(gòu)
在W3C XML schema規(guī)范中規(guī)定所有的Schema文檔都使用<schema>作為其根元素
<schema>元素可以包含一些屬性。一個XMLschema聲明看起來經(jīng)常以如下的形式出現(xiàn)
1、定義一個xml文件
2、書寫一個Schema文件
在Schema文件中 必須以 schema作為 Schema文件的根標(biāo)簽。
xmlns="http://www.w3.org/2001/XMLSchema"
它的含義是表示當(dāng)前的Schema文件是被當(dāng)前指定的url名稱空間所約束。
targetNamespace="http://www.example.org/books"
給當(dāng)前這個Schema文件起名字當(dāng)需要被當(dāng)前這個Schema文件約束的xml文件需要通過當(dāng)前這個名字引入當(dāng)前Schema文件。
targetNamespace屬性對應(yīng)的屬性值可以是任意的內(nèi)容。比如targetNamespace="http://www.huyouta.com/books"
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.huyouta.com/books"
elementFormDefault="qualified">
<!--
在Schema文件中書寫當(dāng)前xml中可以出現(xiàn)的標(biāo)簽 以及子標(biāo)簽 等信息
1、先清楚xml中需要多少標(biāo)簽在Schema文件中就書寫多少個element標(biāo)簽
2、element標(biāo)簽中的 name屬性 就是xml中 可以書寫的標(biāo)簽的名字
3、在Schema中它把xml中可以出現(xiàn)的標(biāo)簽分成簡單標(biāo)簽和復(fù)雜標(biāo)簽
簡單標(biāo)簽只有文本數(shù)據(jù)的標(biāo)簽成為簡單標(biāo)簽
復(fù)雜標(biāo)簽如果標(biāo)簽上有屬性或者有子標(biāo)簽或者有屬性和子標(biāo)簽 或 屬性和文本的標(biāo)簽復(fù)雜標(biāo)簽
4、針對復(fù)雜標(biāo)簽需要在當(dāng)前的標(biāo)簽中書寫子標(biāo)簽來限制當(dāng)前復(fù)雜標(biāo)簽中的其他內(nèi)容
在element標(biāo)簽中需要使用complexType聲明當(dāng)前的element標(biāo)簽name屬性指定的是一個復(fù)雜標(biāo)簽
如果是簡單標(biāo)簽可以使用simpleType
5、對于復(fù)雜標(biāo)簽需要在 complexType中書寫sequence 標(biāo)簽表示子標(biāo)簽的順序
-->
<elementname="books"> <!--books 是一個復(fù)雜標(biāo)簽 -->
<complexType>
<sequence> <!-- 定義當(dāng)前books 標(biāo)簽中的子標(biāo)簽的順序-->
<element name="book">
<complexType> <!-- 聲明當(dāng)前的book 又是一個復(fù)雜標(biāo)簽-->
<sequence>
<!-- 在element 標(biāo)簽中的 type屬性來限制當(dāng)前單標(biāo)簽中文本的類型 -->
<elementname="name" type="string"></element>
<elementname="author"type="string"></element>
<elementname="price"type="double"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
3、在xml文件中引入Schema文件
xmlns="http://www.huyouta.com/books"
在xml中引入 Schema文件的名稱
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.huyouta.com/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.huyouta.com/booksbooks.xsd"
>
<book>
<name>葵花寶典</name>
<author>班長</author>
<price>9.9</price>
</book>
</books>
聲明文檔空間
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.huyouta.com/books "
elementFormDefault="qualified"
attributeFormDefault="unqualified"
>
<xs:schema>
targetNamespace元素用于指定schema文檔中聲明的元素屬于哪個名稱空間。
elementFormDefault元素用于指定局部元素是否受到該schema指定targetNamespace所指定的名稱空間限定
attributeFormDefault元素用于指定局部屬性是否受到該schema指定targetNamespace所指定的名稱空間限定
總結(jié)
在書寫Schema文件的時候需要在Schema文件中 使用 targetNamespace 屬性 給當(dāng)前的Schema文件起名。
把targetNamespace屬性的值做為當(dāng)前 Schema文件的名稱空間。
在xml文件中 需要 通過 xmlns 來引入不同名稱下的Schema文件。
如果我們在同一個 xml文件中引入了多個Schema的名稱空間這時需要大家給這些名稱空間其別名。
如果在xml文件使用了多個 xmlns引入多個名稱空間時需要在xmlns后面使用冒號給當(dāng)前的名稱空間起名。通過這個別區(qū)分到底當(dāng)前xml中的標(biāo)簽受限于具體哪個Schema文件。
DOM-Document Object Model-文檔對像模型。是w3c組織處理xml的一種方式。
特點
一次將所有數(shù)據(jù)全部加載到內(nèi)存中。
對xml文檔中的每一個節(jié)點都當(dāng)成一個Node對像處理。包括元素、文本、屬性。
org.w3c.dom包中的Document,Element,Node。
非常方便進(jìn)行修改。
已經(jīng)集成在了JDK中是Sun對xml操作的標(biāo)準(zhǔn)。
缺點是當(dāng)文檔數(shù)據(jù)量很大時對內(nèi)存的占用很大。
Sax – Sample Api for XML 。
在讀取數(shù)據(jù)時分析數(shù)據(jù)通過事件監(jiān)聽器來完成。
速度快但只適合讀取數(shù)據(jù)僅向前讀取不可后退。
xml可擴(kuò)展的標(biāo)記語言。
不管是html文件還是xml文件它們都是標(biāo)記型文檔都可以使用w3c組織制定的dom技術(shù)來解析。
dom解析技術(shù)是W3C組織制定的而所有的編程語言都對這個解析技術(shù)使用了自己語言的特點進(jìn)行實現(xiàn)。
Java對dom技術(shù)解析標(biāo)記型文檔也做了實現(xiàn)
早期sun公司就制定的 dom 技術(shù)。而這個技術(shù)在頁面xml的時候需要把整個xml文件加載到內(nèi)存中可以根據(jù)getElementById、getElementsByName 、getElementsByTagName 等方法解析。
sun公司在JDK6版本對 dom解析技術(shù)進(jìn)行升級 SAX解析 Stax 解析
sun公司的解析統(tǒng)稱 JAXP。
JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API.
DOM解析-一次性的將數(shù)據(jù)全部裝入內(nèi)存。
SAX解析-邊讀取邊解析。
Dom4j(Document For Java)-第三方開源是從jdom分裂出來的解析技術(shù)。目前jdom已經(jīng)完全被dom4j替代。
jDom – Dom4j的前身。
Dom4j在性能和速度上都比sun公司的要快而且支持Xpath快速查找目前像Spring,Hibernate這些大型的框架都是用的dom4j.
StAX – JDK1.6新特性做為JAXP的新成員已經(jīng)集成在了JDK6當(dāng)中。
Dom4j是一個開源、靈活的XML API。
目前很多開源框架如struts,hibernate都使用dom4j做為解析其xml的工具。
支持文檔的讀寫功能和Xpath快速查詢操作。
由于dom4j 它不是sun公司的技術(shù)而屬于第三方公司的技術(shù)我們需要使用dom4j 就需要到dom4j官網(wǎng)下載dom4j的jar包。
把dom4jjar包拷貝我們的項目中
在自己的項目中新建一個lib文件把dom4j jar包拷貝到其中
把jar包添加到當(dāng)前的classpath路徑中
//注意以下類都來自于org.dom4j包
//1、實例化解析器
SAXReader sax = newSAXReader();
//2、讀取xml文檔
Document doc =sax.read("./src/xml/a.xml");
//3、必須先獲取根節(jié)點
Element root =doc.getRootElement();
//4、獲取第一個人的姓名
String name =root.element("user").element("name").getText();
System.err.println(name);
//演示使用dom4j 獲取 xml中的標(biāo)簽中的數(shù)據(jù)
publicstaticvoid getElement()throws Exception{
SAXReader reader = new SAXReader();
// 獲取dom樹
Document dom = reader.read("users.xml");
//獲取xml中的根標(biāo)簽
Element root = dom.getRootElement();
//獲取根標(biāo)簽下的所有子標(biāo)簽
List<Element> list =root.elements();
//遍歷集合獲取到每個 user標(biāo)簽
for (Element e : list) {
Elementname = e.element("name");
Elementage = e.element("age");
Elementsex = e.element("sex");
System.out.println(name.getText() + ":" + age.getText()+":"+ sex.getText());
}
}
//把最后一個user中的sex 修改為女
publicstaticvoid UpdateElement()throws Exception{
SAXReader reader = new SAXReader();
// 獲取dom樹
Document dom = reader.read("users.xml");
//先獲取根標(biāo)簽
Element root = dom.getRootElement();
//獲取 users 下的所有user標(biāo)簽
List<Element> list =root.elements();
//獲取最后一個user標(biāo)簽
Element lastUser =list.get(list.size()-1);
Element sex = lastUser.element("sex");
sex.setText("女");
//把內(nèi)存中修改后的dom樹重新寫到xml文件中
//創(chuàng)建用于寫出數(shù)據(jù)的流對象
//XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));
//創(chuàng)建一個格式器
OutputFormat format = OutputFormat.createPrettyPrint();
//設(shè)置編碼表
format.setEncoding("gbk");
XMLWriter writer = new XMLWriter(new FileWriter("users.xml") ,format );
//寫出數(shù)據(jù)
writer.write(dom);
//關(guān)流
writer.close();
}
// 刪除
publicstaticvoid deleteElement() throws Exception {
SAXReader reader = new SAXReader();
// 獲取dom樹
Document dom = reader.read("users.xml");
// 刪除最后一個user標(biāo)簽
// 先獲取根標(biāo)簽
Element root = dom.getRootElement();
// 獲取 users 下的所有user標(biāo)簽
List<Element> list = root.elements();
// 獲取最后一個user標(biāo)簽
Element lastUser = list.get(list.size() -1);
root.remove(lastUser);
XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));
writer.write(dom);
// 關(guān)流
writer.close();
}
// 創(chuàng)建一個新的dom寫到文件
publicstaticvoid addElement() throws Exception {
// 先創(chuàng)建一個dom樹這個dom樹在內(nèi)存中
Document dom = DocumentHelper.createDocument();
// 給樹上添加根節(jié)點
Element books = dom.addElement("books");
// 給根books上添加了2個book 標(biāo)簽
Element book = books.addElement("book");
Element book2 = books.addElement("book");
// 給book標(biāo)簽上添加子標(biāo)簽
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// 給book下的子標(biāo)簽中添加文本
name.setText("九陰真經(jīng)");
author.addText("李白");
price.addText("1.1");
// 給book標(biāo)簽上添加子標(biāo)簽
Element name2 = book2.addElement("name");
Element author2 = book2.addElement("author");
Element price2 = book2.addElement("price");
// 給book下的子標(biāo)簽中添加文本
name2.setText("九陽神功");
author2.addText("趙敏");
price2.addText("1.2");
// 給book標(biāo)簽上添加屬性
book.addAttribute("addr", "藏經(jīng)閣");
book2.addAttribute("addr", "桃花島");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(newFileOutputStream("books2.xml"),format);
writer.write(dom);
// 關(guān)流
writer.close();
}
/**
* 這時一個工具類它的功能是完成對dom數(shù)的獲取和保存
*
* @authorwyait
* @version 1.0
*/
publicclass DomUtils {
privatestatic Document dom = null;
static{
try{
SAXReaderreader = new SAXReader();
// 獲取dom樹
dom = reader.read("users.xml");
}catch( Exception e ){
//把異常寫到日志文件中
System.out.println("恭喜您獲取dom樹失敗");
}
}
/**
* 用于獲取dom樹的方法
*/
publicstatic DocumentgetDom(){
returndom;
}
/**
* 保存dom樹
*/
publicstaticvoid saveDom(){
try{
OutputFormatformat = OutputFormat.createPrettyPrint();
XMLWriterwriter = new XMLWriter(new FileOutputStream("users.xml"),format);
writer.write(dom);
// 關(guān)流
writer.close();
}catch(Exception e){
System.out.println("恭喜您保存dom樹失敗");
}
}
}
//1、通過DocumentHelper在內(nèi)存中創(chuàng)建一個Document
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding(“UTF-8”);//XML的編碼格式
//生成一個節(jié)點,生成的第一個節(jié)點也是根節(jié)點此方法只使用一次
Element root =doc.addElement(“users”);
root.addElement(“user”).setText(“Jack”);//再設(shè)置一個子節(jié)點同時設(shè)值
//寫出,如果有中文請使用前一頁所講的技術(shù)處理
XMLWriter writer= new XMLWriter(new FileOutputStream(“a.xml”));
Writer.write(doc);
Writer.close();
xpath技術(shù) 也是 W3C 組織制定的 快速獲取 xml 文件中某個 標(biāo)簽的 技術(shù)。
l XML PATH Language。
l 可以實現(xiàn)快速查詢。
l XPATH包含
XPath 使用路徑表達(dá)式在XML 文檔中進(jìn)行導(dǎo)航。
XPath 包含一個標(biāo)準(zhǔn)函數(shù)庫
l 準(zhǔn)備Xpath的包
jaxen.jar
l Xpath通過以下方法使用
dom.selectNodes – 返回一個List對像
dom.selectSingleNode – 返回一個Node對像
//以下選擇所有的user節(jié)點,處理不帶命名空間的安以下原則
List<Element> list =doc.selectNodes("http://user");
System.err.println(list.size());
//以下選擇所有name節(jié)點
list = doc.selectNodes("http://name");//或從要開始:/users//name
System.err.println(list.size());
//以下選擇所在帶有country屬性的節(jié)點
list = doc.selectNodes("http://user[@country]");
System.err.println(list.size());
//選擇國家是 EN的節(jié)點,可以使用以下方法查詢用戶登錄
//如果country不能重復(fù)則可以使用selectSingleNode
//使用雙引號或單引號都可以//user
Node node =doc.selectSingleNode("http://user[@country=\"EN\"]");
System.err.println(node);
在xpath中 / 表示從根開始找標(biāo)簽 // 表示 不考慮標(biāo)簽的位置 只要匹配上就可以
//abc[@屬性名] 選擇abc標(biāo)簽但是要求abc 必須有指定屬性名
在使用xpath技術(shù)結(jié)合 dom4j 快速獲取標(biāo)簽 發(fā)生了異常
報了類沒有找到異常。這時一般情況下都是缺少jar包。
一般如果缺少jar包的話 在報的異常中的第二個單詞或者第三個單詞是jar包的名稱。
不區(qū)分大小寫的解決方案
以下均為根據(jù)屬性查詢
//以下查詢id元素為XX且name屬性為用戶組的name值的建立全部轉(zhuǎn)成小寫
String path = "http://user[fn:upper-case(@id)=‘XX"'and fn:upper-case(@name)='"+name+"']";
Node n=dom.selectSingleNode(path);//因為確定有一個對象所以使用Single
或是轉(zhuǎn)成小寫以下查詢id屬性為hello的book元素
List list =dom.selectNodes("http://book[fn:lower-case(@id)='hello']");
Xpath模糊查詢屬性
查詢屬性中包含某個值的元素類似于like
//book[contains(@id,’A001’)]
//查詢book的id屬性中包含A001字符串的
既然是模糊查詢當(dāng)然要進(jìn)行一下大小寫轉(zhuǎn)換所以
//book[contains(fn:lower-case(@id),’a001’)]
Xpath通過查詢子元素的值區(qū)別主要元素:不要使用@符號
如XML文檔如下
<books>
<book id=“A001”>
<name>Oracle編程基礎(chǔ)</name>
<price>89.99</price>
</book>
</books>
查詢包含Oracle一詞的所有book元素。
//book[name=‘Oracle’] //精確查詢子元素name的值為Oracle的book元素
//以下是模糊查詢
//book[contains(name,’Oracle’)]
//也可以將name元素的值轉(zhuǎn)成小寫
//book[contains(fn:lower-case(name),’oracle’]
Xpath處理帶有命名空間的XML文檔
由于命名空間的namespace是組成元素的一部分即前綴所以處理帶有命名空間的XML文檔時必須要設(shè)置命名空間
如
對于上面的文檔所有的元素都來自于默認(rèn)命名空間。
Xpath處理帶有命名空間的XML文檔
SAXReader sax = new SAXReader();
//聲明一個map用于保存命名空間
Map<String,String> uris = newHashMap<String, String>();
//給命名空間取一個別名
uris.put("a","http://www.itcast.cn");
//設(shè)置命名空間后再讀取xml文檔
sax.getDocumentFactory().setXPathNamespaceURIs(uris);
Document dom =sax.read("./xml2/a.xml");
//然后使用帶有命名空間的前綴查詢即可。
dom.selectNodes(“//a:book”);
//帶有屬性的查詢同前
dom.selectNodes(//a:book[@id]
//帶有元素的查詢必須要添加命名空間的前綴
dom.seletNodes(“//a:book[a:name=‘oralce’]”); //查詢子元素值為oracle的book元素
l SAXStAX讀取速度快。都是JAXP的成員。
l StAXIterator編程接口和Cursor編程接口。
l Dom4j。Dom。都會將所有節(jié)點加載加載到內(nèi)存中。CRUD非常方便。
l Dom4j支持XPath.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。