xml的應用與開發
1.xml的應用
*不同的系統之間的傳輸數據(qq消息傳輸)
*用來表示生活中有關系的數據(省市區的包含關系)
*經常用在文件配置
**比如現在連接數據庫,肯定知道數據庫的名稱和密碼及用戶名。
**如果修改數據庫信息,則無需修改源代碼,只需修改配置信息即可。
2.xml的申明
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>baojuan</name>
<age>20</age>
<a>a<b</a>
<b>a>b</b>
<c>"a<b"</c>
<b>'a>b'</b>
</person>
註:<?xml version="1.0"encoding="utf-8"?>必須要放在文件的首行,而且xml後必須要有一個空格,encoding前面也必須要有一個空格。
標簽的開始必須要有結束,規範性的。
一個xml文件有且僅有一個根標簽,其他的標簽都是它的子標簽。
在xml文件中會把空格和換行也當作內容來處理。
xml文件是區分大小寫的。標簽不能以數字和下劃線開頭。
xml標簽中不能包含空格和冒號,不能以xml開頭,標簽可以是中文。
對於大於小於號,雙引號,單引號等特殊字符需要進行轉義。但可以用CDATA區進行處理。
寫法:<![CDATA[ 內容 ]]>
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>baojuan</name>
<age>20</age>
<![CDATA[<a>a<b</a>
<b>a>b</b>
<c>"a<b"</c><d>‘a>b‘</d> ]]>
</person>
*PI指令用於指示顯示的樣式,用於引入css文件,但幾乎用不到。xml一般用於保存數據,PI指令只對英文起作用,對中文標簽不起作用。
3.xml約束
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>baojuan</name>
<age>20</age>
<![CDATA[<a>a<b</a>
<b>a>b</b>
<c>"a<b"</c><d>‘a>b‘</d> ]]>
<貓>100</貓>
</person>
*人不可能擁有貓這個屬性,但這樣寫任然符合語法,所以可以運行,so需要一些規則來約束。
xml的約束:dtd約束 schema約束
<?xml version="1.0" encoding="utf-8"?>
<!--引入外部dtd文件<!DOCTYPE 根元素名稱 SYSTEM "dtd路徑">
<!DOCTYPE person SYSTEM "test.dtd">
-->
<!--內部dtd文件 <!DOCTYPE 根元素名稱[內容]>-->
<!DOCTYPE person[
<!--<!ELEMENT person (name+,age,sex,school,面積)>--> //+ 表示可以含有1到多個同樣的實體
<!ELEMENT person (name|age|sex|school|面積)> // | 表示枚舉,只能含列舉出的標簽中的任意一個
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex EMPTY> //EMPTY表示此標簽內必須為空
<!ELEMENT school ANY>
<!ELEMENT 面積 ANY> //ANY表示標簽內可以任意
]>
//(#PCDATA)之前必須要有空格。
<!-- 使用外部網絡上的dtd文件(struts.xml框架)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱""DTD文檔的URL">
-->
<person>
<name>baojuan</name>
<!--<age>20</age>
<sex></sex>
<school>4555</school>
<面積>dhhahs</面積>-->
</person>
4.xml的解析 (dom解析技術和sax解析技術)
**根據xml的層級結構在內存中分配一個樹形結構,把xml的標簽屬性文本都封裝成對象,使用dom來解析時,如果文件過大,會造成內存溢出。
優點:很方便實行增刪改操作。
**使用sax解析時,采用事件驅動,邊都變解析。從上到下依次解析,沒遇到一個對象,就把對象名稱返回,不會造成內存溢出,可以實現查詢,但不能進行增刪改操作。
想要解析xml,首先需要解析器,不同的公司提供了不同的解析器,通過api方式提供。
sun公司提供了jaxp解析器,dom4j組織提供了dom4j解析器(*****實際開發中常用*******),jdom組織提供了jdom解析器。
**jaxp解析器在jdk的javax.xml.parsers包裏面
四個類:針對dom和sax解析的四個類
dom:documentBuilder:解析器類
* 這個類是一個抽象類,不能new,只能使用DocumentBuilderFactory.newDocumentBuilder()
方法獲取。
* 一個方法,可以解析xml,parse("xml路徑"),返回doucument整個文檔。
* 返回的document是一個接口,父節點是node,如果在document裏找不到想要的方法,就要去node裏去找。
* 在document裏,有一個方法,getElementsByTagName(String tagname)返回的是一個nodeList數組,可以得到標簽數組。
* createElement(String tagName)方法創建一個標簽。
* createTextNode(String data)
方法創建一個文本。
* appendChild(Node newChild)
node接口中的方法,將文本添加到標簽下面。
* removeChild(Node oldChild)刪除節點,但要經過父節點來刪。
* getParentNode()
獲取父節點
* NodeList list
getLength() //得到集合的長度
item(int index) //根據下標取到具體的值
for(int i=0;i<list.getLength();i++){
list.item(i);
}
documentBuilderFactory:解析器工廠
這個類是一個抽象類,不能new,只能通過newInstance()來獲得documentBuilderFactory的對象實例。
sax:SAXParser:解析器類
SAXParserFactory:解析器工廠
xml的應用與開發