一、概念
xml檔案多用於資訊的描述,所以在得到一個xml文件之後依照xml中的元素取出對應的資訊就是xml的解析。 Xml解析有兩種方式,一種是DOM解析,另一種是SAX解析,兩種操作的方式如圖。
二、DOM解析
#基於DOM解析的xml分析器是將其轉換為一個物件模型的集合,用樹這種資料結構會將資訊儲存。透過DOM接口,應用程式可以在任何時候存取xml文件中的任何一部分數據,因此這種利用DOM介面存取的方式也被稱為隨機存取。
這種方式也有缺陷,因為DOM分析器將整個xml檔案轉換為了樹存放在記憶體中,當檔案結構較大或資料較複雜的時候,這種方式對記憶體的要求就比較高,且對於結構複雜的樹進行遍歷也是非常耗時的操作。不過DOM所採用的樹狀結構與xml儲存資訊的方式相吻合,同時其隨機存取還可利用,所以DOM介面還是具有廣泛的使用價值。
這裡我們舉個栗子來說明xml轉換為樹的資料結構。
<?xml version="1.0" encoding="GBK"?> <address> <linkman> <name>Van_DarkHolme</name> <email>van_darkholme@163.com</email> </linkman> <linkman> <name>Bili</name> <email>Bili@163.com</email> </linkman> </address>
將該xml轉換為樹的結構為:
#DOM解析中有以下4個核心操作介面
Document:此介面代表了整個xml文檔,表示為整個DOM的根,即為該樹的入口,透過該介面可以存取xml中所有元素的內容。其常用方法如下。
(註:上述圖中雖未畫出,但name與email的屬性也分別為一個節點)
Document常用方法
Node:此介面在整個DOM樹中有著舉足輕重的地位,DOM操作的核心介面都繼承於Node(Document、Element、Attr)。在DOM樹中,每個Node介面代表了一個DOM樹節點
Node介面常用方法
NodeList:此介面表示一個點的集合,一般用於有序關係的一組節點。
NodeList常用方法
NamedNodeMap:此介面表示一組節點和其唯一名稱對應的一一關係,主要用於節點屬性的表示
除了以上四個核心介面外,如果一個程式需要進行DOM解析操作,則需要按照以下步驟進行:
1. 建立DocumentBuilderFactor,用於取得DocumentBuilder物件:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2. 建立DocumentBuidler:
DocumentBuilder builder = factory.newDocumentBuilder();
3. 建立Document物件,取得物件,取得物件,取得樹的入口:
Document doc = builder.parse(“xml檔案的相對路徑或絕對路徑”);
4. 建立NodeList:
NodeList n1 = doc .getElementByTagName(“讀取節點”);
5. 進行xml資訊取得
public class DOMDemo01 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{ //建立DocumentBuilderFactor,用于获得DocumentBuilder对象: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2.建立DocumentBuidler: DocumentBuilder builder = factory.newDocumentBuilder(); //3.建立Document对象,获取树的入口: Document doc = builder.parse("src//dom_demo_02.xml"); //4.建立NodeList: NodeList node = doc.getElementsByTagName("linkman"); //5.进行xml信息获取 for(int i=0;i<node.getLength();i++){ Element e = (Element)node.item(i); System.out.println("姓名:"+ e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println("邮箱:"+ e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue()); } } }
上述程式碼則從第四處開始分析:
透過doc.getElementByTagName(“linkman”)我們得到了一個NodeList,上述xml檔中包含了兩個linkman的節點,所以這裡NodeList中包含了兩個Node(都是linkman節點),然後透過循環的方法來取得xml檔案中的資訊。
Element e = (Element)node.item(i)獲得了linkman節點,即e這裡指向了linkman
e.getElementTagName(“name”).item(0).getFirstChild ().getNodeValue();
getElementTagName(“name”);獲得了該linkman下的所有name節點(其實就1個);
Item(0);取第一個Name節點(就一個);
getFristChild();取得name節點下的文字節點,也就是內容van所在的節點(上面已經提到過,文字內容也是一個單獨的節點,Document方法清單中的createTextNode()就是建立文字節點);
getNodeValue()取得文字節點的值:van_darkholme;
跟多相關問題請存取PHP中文網:XML影片教學
以上是有關XML解析中DOM解析的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!