這輩子沒辦法做太多事情所以每一件都要做到精彩絕倫
在瀘縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,網(wǎng)絡(luò)營銷推廣,外貿(mào)網(wǎng)站建設(shè),瀘縣網(wǎng)站建設(shè)費(fèi)用合理。
People can't do too many things in my life,so everything will be wonderful
本文檔參考資料w3cschool.CHM API教程文檔免費(fèi)下載地址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 最簡單的聲明語法
l 用encoding屬性說明文檔的字符編碼經(jīng)常使用的
l 用standalone屬性說明文檔是否獨(dú)立
拖入瀏覽器解析
注意如果使用記事本編輯的話會解析錯誤中文亂碼問題。只是使用記事本編輯的時候會出現(xiàn)其原因如下
l 常見錯誤
1. 屬性沒加引號
2. 全角空格
3.編碼錯誤
XML元素指XML文件中出現(xiàn)的標(biāo)簽一個標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽一個標(biāo)簽有如下幾種書寫形式例如
包含標(biāo)簽體wyait.blog.51cto.com/
一個標(biāo)簽中也可以嵌套若干子標(biāo)簽。但所有標(biāo)簽必須合理的嵌套絕對不允許交叉嵌套例如
welcometo wyait.blog.51cto.com/
格式良好的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ū)分大小寫例如
和
是兩個不同的標(biāo)記。
不能以數(shù)字開頭
不能包含空格
名稱中間不能包含冒號: --- Schema約束沖突
不建議"_"(下劃線)開頭
一個標(biāo)簽可以有多個屬性每個屬性都有它自己的名稱和取值例如
屬性值一定要用雙引號"或單引號'引起來
定義屬性必須遵循與標(biāo)簽相同的命名規(guī)范
在XML技術(shù)中標(biāo)簽屬性所代表的信息也可以被改成用子元素的形式來描述例如
Xml文件中的注釋采用“”格式。
注意
XML聲明之前不能有注釋
注釋不能嵌套例如
……
-->
在編寫XML文件時有些內(nèi)容可能不想讓解析引擎解析執(zhí)行而是當(dāng)作原始內(nèi)容處理。
遇到此種情況可以把這些內(nèi)容放在CDATA區(qū)里對于CDATA區(qū)域內(nèi)的內(nèi)容XML解析程序不會處理而是直接原封不動的輸出。
語法
]]>
在html表示換行
]]>
<h2>在html表示的是標(biāo)題標(biāo)簽
l 對于一些單個字符若想顯示其原始樣式也可以使用轉(zhuǎn)義的形式予以處理。
常見的XML轉(zhuǎn)義字符記錄如下:
空格:
換行:
縮進(jìn):
應(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)容。
處理指令必須以“”作為開頭以“?>”作為結(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書寫在同一個文件中
寫dtd的約束
] >
XML文件使用 DOCTYPE聲明語句來指明它所遵循的DTD文件DOCTYPE聲明語句有兩種形式
當(dāng)引用的文件在本地時外部DTD采用如下方式
例如 。在xml文件中手寫一下。
l 當(dāng)引用的文件是一個公共的文件時公共DTD采用如下方式
例如
"-//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)簽中可以書寫文本
屬性名 屬性類型 屬性約束
屬性名 屬性類型 屬性約束
...
>
當(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沒有提供強(qiáng)大的數(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運(yùn)用于一個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文檔都使用
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"
targetNamespace="http://www.huyouta.com/books"
elementFormDefault="qualified">
3、在xml文件中引入Schema文件
xmlns="http://www.huyouta.com/books"
在xml中引入 Schema文件的名稱
"1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.huyouta.com/booksbooks.xsd"
>
聲明文檔空間
targetNamespace="http://www.huyouta.com/books " elementFormDefault="qualified" attributeFormDefault="unqualified" > 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 //遍歷集合獲取到每個 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 //獲取最后一個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 //獲取最后一個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 Documentdom =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)建一個Document5. XML解析
5.1 解析XML的方式
Dom4j
5.2.1 獲取document對象
5.2.2 獲取所有標(biāo)簽中的文本值
5.2.3 修改指定標(biāo)簽中的值
5.2.4 刪除標(biāo)簽
5.2.5 增加標(biāo)簽
5.2.6 工具類抽取
5.2.7 Dom4j生成一個新的XML文件
標(biāo)題名稱:XML技術(shù)-Schema約束-Dom4j-Xpath詳解
網(wǎng)站URL:http://weahome.cn/article/pjgjsh.html