Xml學習(2)
1、CDATA區:
非法字元
嚴格的講,在XML中僅有字元“<”和“&”是非法的。省略號、引號和大於號是合法的,但是把它們替換為實體引用是個好習慣。
< <
& &
如果某段字串裡面有過多的字元,並且裡面包含了類似標籤或者關鍵字的這種文字,不想讓xml的解析器去解析,那麼可以使用CDATA
<des><![CDATA[<a href="http://www.baidu.com">我愛Java</a>]]></des>
CDATA部分中的所有內容都會被解析器忽略。由"<![CDATA["開始,由“]]>”結束。CDATA一般比較少看到,通常在伺服器給客戶端返回資料的時候。
2、XML解析
>其實就是獲取裡面的字元資料或者屬性資料。
3、XML解析方式(面試常問)
>有很多種,但是常用的有兩種
>DOM:(document Object model)把所有文件全部讀取到記憶體當中形成樹結構,整個文件稱之為document物件,屬性對應Attribute物件,所有元素節點對應Element物件,文字稱之為Text物件,以上所有物件稱之為Node節點。如果xml特別大,則造成記憶體溢位,可以對文件進行增刪。
>SAX:Simple API for xml ,基於事件驅動,讀取一行,解析一行。不會造成記憶體溢位,不可以進行增刪,只能查詢。
針對這兩種解析方式的API
jaxp(sun公司,比較繁瑣)、jdom、dom4j(使用比較廣泛)
4、Dom4j基本用法
1)建立SaxReader物件、
2)指定解析的xml
3)獲取根元素
4)根據根元素獲取子元素或者下面的子孫元素
try { //1. 建立sax讀取物件 SAXReader reader = new SAXReader(); //jdbc -- classloader //2. 指定解析的xml源 Document document = reader.read(new File("src/xml/stus.xml")); //3. 得到元素、 //得到根元素 Element rootElement= document.getRootElement(); //獲取根元素下面的子元素 age //rootElement.element("age") //System.out.println(rootElement.element("stu").element("age").getText()); //獲取根元素下面的所有子元素 。 stu元素 List<Element> elements = rootElement.elements(); //遍歷所有的stu元素 for (Element element : elements) { //獲取stu元素下面的name元素 String name = element.element("name").getText(); String age = element.element("age").getText(); String address = element.element("address").getText(); System.out.println("name="+name+"==age+"+age+"==address="+address); } } catch (Exception e) { e.printStackTrace(); }
5、Dom4j的Xpath使用
>dom4j裡面支援Xpath的寫法。xpath其實是xml的路勁語言,支援我們在解析xml的時候,能夠快速的定位到具體的某一個元素
1)新增jar包依賴 jaxen-1.1-beta-6.jar
2)在查詢指定節點的時候,根據XPath語法規則來查詢
3)後續的程式碼與以前的·解析程式碼一樣。
//要想使用Xpath, 還得新增支援的jar 獲取的是第一個 只返回一個。
Element nameElement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());
System.out.println("----------------");
//獲取文件裡面的所有name元素
List<Element> list = rootElement.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}