大数据WEB阶段(一)XML文件的操作
生活随笔
收集整理的這篇文章主要介紹了
大数据WEB阶段(一)XML文件的操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
XML
一、XML概述
- XML是什么?
- XML : Extensible Markup Language 可擴展標記語言 。 由w3c組織提供 , 2000年開發出1.0版本 , 現在用1.0版本居多 。
- XML是一種數據存儲或傳輸的格式 , 本質上就是一串字符串 。
- XML是怎么保存數據的?
- 在XML中 , 利用標簽來保存數據 , 利用標簽之間的層級關系表示數據之間的層級關系 。
- 用戶可以自定義標簽 , 標簽分為開始標簽和結束標簽 , 在開始標簽和結束標簽之間可以嵌套其它標簽 。
- XML應用場景
- 傳輸數據
- 由于XML本質上是一段字符串 , 具有跨平臺性 , 所以可以在不同的系統之間進行數據交換 。
- 如:天氣數據XML接口 :http://flash.weather.com.cn/wmaps/xml/china.xml
- 用作配置文件
- XML可以有結構的保存數據 , 因此XML常常用作應用程序的配置文件
- 傳輸數據
二、XML語法
文檔聲明
可以用來聲明XML文檔的基本屬性信息 , 解析器會根據文檔 聲明類決定如何解析這個文檔 。
<?xml version="1.0" ebcoding="utf-8" ?>- version 用于指定XML文檔所遵循的XML版本
- encoding 用于通知XML解析器使用什么編碼來解析該文檔 encoding指定的編碼必須和xml保存時指定的編碼一致, 否則會出現亂碼 。
- 注意:
- 一個XML文檔有且僅有一個文檔聲明(規范要求)
- 文檔聲明只能放在文檔的首行 , 并且前面不能有任何內容 。
- 如果一個XML文檔沒有文檔聲明 , 該文檔是一個格式不良好的XML文檔 。
元素
一個標簽就是一個元素
如:<book></book>其中 <book> 為開始標簽 </book>為結束標簽如果一個標簽體內沒有任何內容 , 那么可以將開始標簽和結束標簽合并
如: <book/>- 一個xml文檔中只能有一個根標簽
標簽之間可以嵌套 , 來表示數據之間的層級關系 , 但不能出現交叉嵌套
比如: <a>welcome to <b>www.tarena.com.cn</a></b> 錯誤 <a>welcome to www.tarena.com.cn</b></a> 錯誤 <a>welcome to www.tarena.com.cn<b/></a> 正確 <a>welcome to www.tarena<b/>.com.cn</a> 正確XML元素的命名規范:
區分大小寫
如: <a/> 與 <A/> 是兩個不同標簽不能以數字或標點符號開頭
如: <123a/> 錯誤- 不能以任意形式的xml開頭
- 不能包含空格
- 不能包含冒號
- 屬性
- 一個標簽可以有多個屬性 , 多個屬性之間可以用空格分開 , 屬性值一定要用單引號, 或雙引號引起來 。
- 屬性具有與 元素相同的命名規范 。
注釋
格式
<!-- 內容-->- 注意::
- 注釋不能放在文檔聲明前
- 注釋不能嵌套
轉義字符
用其他符號代替特殊符號
幾個常用的轉義字符 < < > > " " ' ' & &
- XML解析
- DOM解析
- SAX解析
- 解析開發包
- Jaxp 、 Jdom 、 dom4j
三、實例
- 編寫程序之前 ,需要些導入相應的解析XML的包dom4j.jar , 并build path
被操作的XML文檔
<?xml version="1.0" encoding="utf-8" ?> <書架> <書> <書名>數據結構</書名> <作者>嚴蔚敏</作者> <售價>29.00元</售價> </書> <書> <書名>高等數學</書名> <作者>同濟大學數學系</作者> <售價>55.00元</售價></書> </書架>入門程序
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;/*** dom4j快速入門程序*/ public class Demo1 {public static void main(String[] args) throws DocumentException {//1.創建解析器SAXReader reader = new SAXReader();//2.利用解析器讀取xml文件Document doc = reader.read("book.xml");//3.獲取根節點Element root = doc.getRootElement();//4.獲取第一本書節點Element bookEle = root.element("書");//5.獲取第一個書名節點Element bookNameEle = bookEle.element("書名");//6.獲取書名中的內容String text = bookNameEle.getText();System.out.println("第一本書的書名為:"+text);} }操作元素
- 在案例中先將創建解析器 , 讀取文檔這兩部每次都需要寫的操作抽取了出來作為工具方法
- 對文檔進行增、刪、改后 , 需要將修改后的文檔重新寫入到xml中 , 所以也把重新寫回xml的步驟也抽取出來 形成一個XMLUtils工具類 。
XMLUtils工具類
import java.io.File; import java.io.FileOutputStream;import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;public class XMLUtils {/*** 將更新的document寫入到xml中* @param doc* @param xmlPath*/public static void write2Xml(Document doc, String xmlPath){try {//將更新的document寫入到xml中,并加入格式輸出器XMLWriter writer = new XMLWriter(new FileOutputStream(new File("book.xml")),OutputFormat.createPrettyPrint());writer.write(doc);writer.close();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/*** 解析xml文件,獲取document對象* @param xmlPath* @return*/public static Document getDoc(String xmlPath){try {//1.創建解析器SAXReader reader = new SAXReader();//2.利用解析器讀取xml文件Document doc = reader.read(xmlPath);return doc;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e); }} }
*對XML文檔中的元素進行增、刪、改、查
import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/*** dom4j操作元素節點**/public class Demo2 {public static void main(String[] args) throws DocumentException, IOException {//2.查詢第二本書的售價,并輸出到控制臺//findPrice();//3.給第一本書添加一個特價節點(2種方式)//addPrice();//4.給第二本書在作者節點前插入一個特價節點//addPrice2();//5.刪除第二本書的特價節點(2種方式)//deletePriceEle();//6.更新第一本書的特價節點的內容為19.8元//創建解析器并獲取根節點Document doc = XMLUtils.getDoc("book.xml");doc.getRootElement().element("書").element("特價").setText("19.8元");//將更新的document寫入到xml中XMLUtils.write2Xml(doc, "book.xml");System.out.println("執行完畢");}private static void deletePriceEle() {//創建解析器并獲取根節點Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取root下所有節點集合List<Element> list = root.elements();//獲取第二個本書Element bookEle2 = list.get(1);/*//方法一//獲取特價節點Element priceEle2 = bookEle2.element("特價");//將特價節點從第二本書中刪除bookEle2.remove(priceEle2);*///方法二//獲取第二本書所有元素List list2 = bookEle2.elements();//刪除第二個元素list2.remove(1);//將更新的document寫入到xml中XMLUtils.write2Xml(doc, "book.xml");}private static void addPrice2() {//創建解析器并獲取根節點Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取root下所有節點集合List<Element> list = root.elements();//獲取第二個元素Element bookEle2 = list.get(1);//創建一個游離節點Element priceEle2 = DocumentHelper.createElement("特價");priceEle2.setText("6.6元");//將游離節點插入到指定位置List list2 = bookEle2.elements();list2.add(1, priceEle2);//將更新的document寫入到xml中XMLUtils.write2Xml(doc, "book.xml");}private static void addPrice() throws UnsupportedEncodingException,FileNotFoundException, IOException {//創建解析器并獲取根節點Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取第一本書Element bookEle = root.element("書");/*//方式一//創建一個游離的節點Element priceEle2 = DocumentHelper.createElement("特價");priceEle2.setText("9.9元");//將游離節點掛載到第一本書上bookEle.add(priceEle2);*///方式二//在第一本書上添加特價子節點Element priceEle2 = bookEle.addElement("特價");priceEle2.setText("8.8元");//將更新的document寫入到xml中,并加入格式輸出器XMLWriter writer = new XMLWriter(new FileOutputStream(new File("book.xml")),OutputFormat.createPrettyPrint());writer.write(doc);writer.close();}private static void findPrice() throws DocumentException {//1.創建解析器SAXReader reader = new SAXReader();//2.利用解析器讀取xml文件Document doc = reader.read("book.xml");//3.獲取根節點Element root = doc.getRootElement();//4.獲取root下所有節點集合List<Element> list = root.elements();//5.獲取第二本書節點Element bookEle2 = list.get(1);//6.獲取第二本書的售價節點Element price = bookEle2.element("售價");//7.獲取售價String text = price.getText();System.out.println("第二本書的售價為:"+text);}}操作元素的屬性
import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;/*** dom4j操作屬性節點*/public class Demo3 {public static void main(String[] args) {//1.給第一本書添加一個屬性,如:出版社="清華大學出版社"(2種方式)//addAttr();//2.在控制臺上打印輸出第一本書的出版社屬性的值,并更新屬性的值為“人民出版社”(3種方式)//findAndUpdateAttr();//3.刪除第一本書的出版社屬性(2種方式)//創建解析器,讀取xml,獲取根目錄Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取第一本書Element bookEle = root.element("書");/*//方式一//獲取第一本書的屬性Attribute attr = bookEle.attribute("出版社");//將屬性從第一本書中刪除bookEle.remove(attr);*///方式二//如果給一個正常值,為添加,如果給一個null,則為刪除bookEle.addAttribute("出版社",null);//將更新的document寫入到xml文檔中XMLUtils.write2Xml(doc, "book.xml");System.out.println("執行完成");}private static void findAndUpdateAttr() {//創建解析器,讀取xml,獲取根目錄Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取第一本書Element bookEle = root.element("書");//方式一//Attribute attr = bookEle.attribute(0);//方式二Attribute attr = bookEle.attribute("出版社");attr.setValue("人民出版社");System.out.println(attr.getName()+":"+attr.getValue());//方式三//String value = bookEle.attributeValue("出版社");//System.out.println(value);//將更新的document寫入到xml文檔中XMLUtils.write2Xml(doc, "book.xml");}private static void addAttr() {//創建解析器,讀取xml,獲取根目錄Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//獲取第一本書Element bookEle = root.element("書");/*//方法一//創建一個游離的屬性Attribute attr = DocumentHelper.createAttribute(bookEle, "出版社", "清華大學出版社");//將游離的屬性掛載到第一本書上bookEle.add(attr);*///方法二//在第一本書上直接添加屬性bookEle.addAttribute("版次","1.0");//將更新的document寫入到xml文檔中XMLUtils.write2Xml(doc, "book.xml");}}
總結
以上是生活随笔為你收集整理的大数据WEB阶段(一)XML文件的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 套接字Socket
- 下一篇: Java中的八种锁