認識XML
XML是Extensible Markup Language 即可擴展標記語言的縮寫,是一種簡單的數據儲存語言,使用一系列簡單的標記來描述數據
<element_name attribute_name="value" .../> // 自閉合 <element_name attribute_name="value" ...> //對 1-String 2-<element_name attribute_name="value" .../> 3-<element_name attribute_name="value" .../> ... </element_name> </element_name> 對
XML的四種解析
目前常用的XML解析技術有4種:
(1)DOM
DOM是基於XML的樹結構來完成解析的,DOM解析XML的方式非常適用於多次訪問XML的應用程序,但是其比較消耗資源;
(2)SAX
SAX是一種基於事件的解析,其主要是為了解決DOM解析的資源消耗問題而出現的,其優勢是占用資源少,內存消耗小,一般在處理解析數據量大的XML文檔才會使用
(3)JDOM
JDOM的目的是直接為JAVA編程服務,利用純Java技術對XML文檔實現解析生成,序列化以及其他操作;
(4)DOM4J
DOM4J具有性能優異、功能強大和易用的特點,同時它也是一個開放源代碼的軟件
如何用DOM4J解析XML數據
注:使用DOM4J解析XML,依賴於jar包 dom4j和jaxen
實現的步驟:
指定要解析的XML文件;
把XML文件轉換成Document對象;
獲取節點屬性或文本的值。
File xml = new File("xmlfiles/xxx"); SAXReader reader = new SAXReader(); Document doc = reader.read(xml);//轉換為文件 Element root = doc.getRootElement();//獲取節點屬性 List<Element> elements = root.elements(); //element 節點
下面舉一例分別分析xml文檔
xml文檔內容如下
<?xml version="1.0" encoding="UTF-8"?> <root> <student id="1"> <name>張飛</name> <age>999</age> <gender>男</gender> </student> <student id="2"> <name>關羽</name> <age>888</age> <gender>男</gender> </student> <student id="3"> <name>劉備</name> <age>777</age> <gender>男</gender> </student> </root>
若要讀取XML文檔中,可以直接用字符串輸出的方式遍歷,首先獲取子元素,再遍歷子元素文本
//字符串輸出 for (Element element : elements) { String id = element.attributeValue("id");//獲取當前指定子元素 System.out.print(id+"\t"); List<Element> subEs = element.elements(); for (Element subE : subEs) { System.out.print(subE.getText()+"\t");//獲取當前子元素文本 } System.out.println("\n"); }
對於一個XML文檔,我們也許需要檢索所有的內容,但有時也可能需要檢索某一固定節點或某一個屬性,因此我們需要采取不同的檢索方式
(1)當我們需要檢索所有內容時,可以用動態數組的形式遍歷出來即可;
(2)當需要檢索某一固定節點
Node node = document.selectSingleNode("//nodeName[@attrName = value]");
(3)檢索某一屬性(多節點檢索)
List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']");
取一分析結果,輸出如下
//檢索固定節點 Node node = doc.selectSingleNode("//student[@id=3]");//任意以student為根的節點 if (null != node){ Element element =(Element)node; String id = element.attributeValue("id"); String name = element.elementText("name"); String age = element.elementText("age"); String gender = element.elementText("gender"); Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender); System.out.println(student); }
當我們需要對XML文件進行改動時,有三種情況分別為新增、刪除以及修改(變動過之后必須落盤)
(1)新增
Element ele = root.addElement(...);
Element subEle = ele.addElement(String nodeName);
(2)刪除
Element xxx = ...
father.renmove(xxx);
(3)修改
xxx.attribute(String attrName).setValue(String value);
xxx.element(String subName).setText(String text);
下面例子為刪除操作
//刪除 //內存操作 Node node = doc.selectSingleNode("//xxx[@id=3]"); if (null != node){ root.remove(node); //存盤 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new OutputStreamWriter( new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format); writer.write(doc); writer.flush(); writer.close(); }else { System.out.println("用戶不存在"); }