Extensible Markup Language 可擴展的標記語言.XML技術是W3C組織發佈的,目前推薦遵循的是W3C組織於2000年發佈的XML1.0規範。在現實生活中大量存在有關係的數據。能夠經過XML技術來描述這些關係數據。在XML語言中,它容許用戶自定義標籤。一個標籤用於描述一段數據:一個標籤可分爲開始標籤和結束標籤。在開始標籤和結束標籤之間又可使用其它標籤描述其它數據。node
<中國> <北京> <海淀></海淀> <豐臺></豐臺> </北京> <杭州> <西湖></西湖> <濱江></濱江> </杭州> </中國>
<!--standalone:是不是獨立的文檔。--> <!--在xml中,空格和換行都做爲原始內容被處理。--> <!--不要出現中文全角空格。--> <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!--包含標籤體--> <a>內容</a> <!--不包含標籤體--> <a/> <!--嵌套標籤,不容許交叉嵌套。--> <a> <b>內容2</b> </a> <!--XML文檔只能有一個根標籤。--> <soft> <c></c> <d></d> </soft> <!--對於XML標籤中出現的全部空格和換行,XML解析程序都會看成標籤內容進行處理。--> <網址> www.163.com </網址>
<!--XML屬性的定義。--> <demo name="text"></demo> <!--也可使用標籤嵌套的方式來使用屬性。--> <demo> <name>text</name> </demo>
<!-- 註釋 --> <!--XML聲明以前不能有註釋--> <!--註釋不能嵌套-->
一、要用必定的規範來約束XML語言,按照自定義規範來編寫XML文檔。app
二、XML約束技術:XML DTD 和 XML Schema技術。dom
一、DTD(Document Type Definition文檔類型定義) book.dtd性能
<!--元素定義:ELEMENT 書架 (書+):括號裏放入元素名稱 書架 ANY:括號裏放入元素類型ANY標識任何類型 書 (書名,做者,售價):用逗號分割,表示內容的出現順序必須與聲明時一致 書 (書名|做者|售價):用|分割,表示任選其一,即多個只能出現一個 書+:一次或屢次 書?:0次或一次 書*:0次或屢次 書:必須出現一次 --> <!ELEMENT 書架 (書+)> <!-- 中間空格不可缺 --> <!ELEMENT 書 (書名,做者,售價)> <!ELEMENT 書名 (#PCDATA)><!-- #PCDATA:字符串 --> <!ELEMENT 做者 (#PCDATA)> <!ELEMENT 售價 (#PCDATA)> <!--爲元素設置屬性--> <!--爲標籤配置屬性定義 經過 ATTLIST 元素設置屬性 屬性名 屬性值類型(CDTAT:字符串,ENUMERATED:枚舉,ID,ENTITY:實體) 設置說明(#REQUIRED:必須的。#IMPLIED:能夠設置也能夠不設置。#FIXED:固定值) <!ATTLIST 元素名 姓名 字符串 可選的 年齡 CDATA 可選的 聯繫信息 CDATA 必須的 網站職務 CDATA 固定值 提供的固定值 我的愛好 CDATA 直接使用默認值 > --> <!ATTLIST 做者 姓名 CDATA #IMPLIED 年齡 CDATA #IMPLIED 聯繫信息 CDATA #REQUIRED 網站職務 CDATA #FIXED "CTO" 我的愛好 CDATA "ABC" >
二、book.xml就能夠按照dtd文件元素定義的約束規範來寫了。網站
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 書架 SYSTEM "book.dtd"> <書架> <書> <書名>Spring攻略第二版</書名> <做者 聯繫信息="110">Gary Mak Josh Long</做者> <售價>100元</售價> </書> <書> <書名>JavaWeb開發</書名> <做者 聯繫信息="110">方立勳</做者> <售價>80元</售價> </書> </書架>
DOM解析方式 ui
/**spa
* DOM解析方式(文檔對象模型 W3C標準) :code
* DOM解析會把整個文檔放入直接放入內存裏(以對象樹的方式)orm
* 1.把每一個節點變成Element對象xml
* 2.把每一個屬性變成Attribute對象
* 3.把每一個文本變成Text對象
* 優勢:對文檔的增刪改查比較容易。
* 缺點:若是文檔比較大,內存就會溢出。
* 在DOM解析下,xml文檔的每個組成部分都會用對象來表示,如:標籤名用Element,屬性名用Attribute
* 可是無論什麼對象,都是Node(節點對象)的子類,在開發中獲取的任意節點均可以當作Node來使用。
*/
/** * DOM解析:使用jaxp方式(性能最差) * 獲取某個節點下的文本值 * @throws Exception */ @Test public void testJaxp1() throws Exception{ //1.建立工廠 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.獲取DOM對象樹的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文檔,獲取表明文檔的Document對象 Document document = documentBuilder.parse("src/book.xml"); //4.獲取指定標籤名的元素,返回一個集合 NodeList nodeList = document.getElementsByTagName("書名"); //5.獲取nodeList下指定的元素 Node node = nodeList.item(1); //6.獲取元素下的文本值 String content = node.getTextContent(); //7.打印 System.out.println(content); } /** *DOM解析:使用jaxp方式(性能最差) 遍歷全部的節點(遞歸) * @throws Exception */ @Test public void testJaxp2() throws Exception{ //1.建立工廠 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.獲取DOM對象樹的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文檔,獲取表明文檔的Document對象 Document document = documentBuilder.parse("src/book.xml"); //4.獲取根節點(根節點只有一個) NodeList nodeList = document.getElementsByTagName("書架"); Node node = nodeList.item(0); list(node); } private void list(Node node) { if(node instanceof Element){ System.out.println(node.getNodeName()); } //1.獲得當前根節點下的全部子節點 NodeList nodeList = node.getChildNodes(); //2.遍歷全部的子節點 for (int i = 0; i <nodeList.getLength(); i++) { //3.若是當前子節點還有子節點,獲取子節點的子節點 Node child = nodeList.item(i); //4.遞歸 list( child ); } } //獲得標籤下的某個屬性值 @Test public void testJaxp3() throws Exception{ //1.建立工廠 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.獲取DOM對象樹的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文檔,獲取表明文檔的Document對象 Document document = documentBuilder.parse("src/book.xml"); //4.獲取指定標籤名的元素,返回一個集合(在這裏咱們知道做者這個標籤是Element元素才進行強轉) Element element = (Element) document.getElementsByTagName("做者").item(0); //5.獲取屬性值 String content = element.getAttribute("聯繫信息"); //6.打印 System.out.println(content); } //添加節點 @Test public void testJaxp4() throws Exception{ //1.建立工廠 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //2.獲取DOM對象樹的解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //3.解析XML文檔,獲取表明文檔的Document對象 Document document = documentBuilder.parse("src/book.xml"); //4.建立標籤 Element priceElement = document.createElement("售價"); //5.爲標籤體設置內容 priceElement.setTextContent("59"); //6.獲得新建立的標籤想要添加的位置 Node book = document.getElementsByTagName("書").item(0); //7.添加新建立的標籤 book.appendChild(priceElement); //8.把更新後的內存中的document對象樹從新寫回xml文檔裏 Transformer transformer = TransformerFactory.newInstance().newTransformer(); Source xmlSource = new DOMSource(document); transformer.transform(xmlSource, new StreamResult(new FileOutputStream("src/book.xml"))); }