首頁 >後端開發 >XML/RSS教程 >java讀取解析xml檔案實例

java讀取解析xml檔案實例

高洛峰
高洛峰原創
2017-01-11 13:03:221605瀏覽

讀取本地的xml文件,透過DOM解析,DOM解析的特點就是把整個xml文件裝載入記憶體中,形成一顆DOM樹形結構,樹結構是方便遍歷和操縱。

DOM解析的特性就是讀取xml檔轉換為 dom樹狀結構,透過節點進行遍歷。

這是W3c關於節點的概念

如果xml中包含有大量的數據,由於dom一次把xml裝入內存中的特性,所以dom不適合包含大量數據的xml解析。當包含有大量xml的時候,用SAX進行解析比較節省記憶體。

下面是一個運用DOM進行解析xml檔的範例:

xml檔結構如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
 <book category="cooking">
 <title>Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 </book>
 <book category="children">
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
 </book>
 <book category="web">
 <title>XQuery Kick Start</title>
 <author>James McGovern</author>
 <year>2003</year>
 <price>49.99</price>
 </book>
 <book category="web" cover="paperback">
 <title>Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
 </book>
</bookstore>

建立解析xml的類別如下:

package xml.dom;
 
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class ReadXmlFile {
  
 public static void main(String[] args) {
  
 try{
   
  File xmlFile = new File("src/resource/book.xml");
   
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
   
  DocumentBuilder builder = builderFactory.newDocumentBuilder();
   
  Document doc = builder.parse(xmlFile);
   
  doc.getDocumentElement().normalize();
   
  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());
   
  NodeList nList = doc.getElementsByTagName("book");
   
  for(int i = 0 ; i<nList.getLength();i++){
   
  Node node = nList.item(i);
   
  System.out.println("Node name: "+ node.getNodeName());
  Element ele = (Element)node;
   
  System.out.println("----------------------------");
  if(node.getNodeType() == Element.ELEMENT_NODE){
   
  System.out.println("book category: "+ ele.getAttribute("category"));
   
  System.out.println("title name: "+ ele.getElementsByTagName("title").item(0).getTextContent());
   
  System.out.println("author name: "+ele.getElementsByTagName("author").item(0).getTextContent());
   
  System.out.println("year :"+ele.getElementsByTagName("year").item(0).getTextContent());
   
  System.out.println("price : "+ele.getElementsByTagName("price").item(0).getTextContent());
   
  System.out.println("-------------------------");
   
   
  }
   
   
  }

解析結果:

Root element: bookstore
Node name: book
----------------------------
book category: cooking
title name: Everyday Italian
author name: Giada De Laurentiis
year :2005
price : 30.00
-------------------------
Node name: book
----------------------------
book category: children
title name: Harry Potter
author name: J K. Rowling
year :2005
price : 29.99
-------------------------
Node name: book
----------------------------
book category: web
title name: XQuery Kick Start
author name: James McGovern
year :2003
price : 49.99
-------------------------
Node name: book
----------------------------
book category: web
title name: Learning XML
author name: Erik T. Ray
year :2003
price : 39.95
-------------------------

package xml.dom;
 
import java.io.File;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class ReadXmlFile2 {
  
 public static void main(String[] args) {
 try{
   
  File xmlFile = new File("src/resource/book.xml");
   
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
   
  DocumentBuilder builder = builderFactory.newDocumentBuilder();
   
  Document doc = builder.parse(xmlFile);
   
  doc.getDocumentElement().normalize();
   
  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());
   
   
  if(doc.hasChildNodes()){
   
  printNode(doc.getChildNodes());
  }
 }catch(Exception e){
  
 e.printStackTrace();
  
 }
  
 }
  
 public static void printNode(NodeList nodeList){
 System.out.println("------------------------");
 // System.out.println(nodeList.getLength());
 for(int i = 0; i<nodeList.getLength(); i++){
  
 Node node = (Node)nodeList.item(i);
  
  
 if(node.getNodeType() == Node.ELEMENT_NODE){
  
 System.out.println("node name: "+node.getNodeName());
  
 System.out.println("node value: "+node.getTextContent());
  
 if(node.hasAttributes()){
  NamedNodeMap nodeMap = node.getAttributes();
   
  for(int j = 0; j < nodeMap.getLength() ; j++){
   
  Node nodenew = nodeMap.item(j);
   
  System.out.println("node name "+nodenew.getNodeName());
  System.out.println("node value "+nodenew.getNodeValue());
  }
 }
 if(node.hasChildNodes()){
  printNode(node.getChildNodes());
 }
 }
  
 }
  
 }
 
}

下面利用循環節點的方式輸出:
循環節點輸出方式的程式碼如下:

Root element: bookstore
------------------------
node name: bookstore
node value: 
  
 Everyday Italian
 Giada De Laurentiis
 2005
 30.00
  
  
 Harry Potter
 J K. Rowling
 2005
 29.99
  
  
 XQuery Kick Start
 James McGovern
 2003
 49.99
  
  
 Learning XML
 Erik T. Ray
 2003
 39.95
  
 
------------------------
node name: book
node value: 
 Everyday Italian
 Giada De Laurentiis
 2005
 30.00
  
node name category
node value cooking
------------------------
node name: title
node value: Everyday Italian
node name lang
node value en
------------------------
node name: author
node value: Giada De Laurentiis
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 30.00
------------------------
node name: book
node value: 
 Harry Potter
 J K. Rowling
 2005
 29.99
  
node name category
node value children
------------------------
node name: title
node value: Harry Potter
node name lang
node value en
------------------------
node name: author
node value: J K. Rowling
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 29.99
------------------------
node name: book
node value: 
 XQuery Kick Start
 James McGovern
 2003
 49.99
  
node name category
node value web
------------------------
node name: title
node value: XQuery Kick Start
node name lang
node value en
------------------------
node name: author
node value: James McGovern
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 49.99
------------------------
node name: book
node value: 
 Learning XML
 Erik T. Ray
 2003
 39.95
  
node name category
node value web
node name cover
node value paperback
------------------------
node name: title
node value: Learning XML
node name lang
node value en
------------------------
node name: author
node value: Erik T. Ray
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 39.95
------------------------

輸出結果如下:

<book category="cooking">
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

關於節點的問題:

rrreee

對於book應用:doc.getChildNodes() 得到一個NodeListreee
對於book應用:doc.getChildNodes() 得到一個Node其中NodeListreee
對於book應用:doc.getChildNodes() 得到一個NodeListreee?長度為9
9個節點分別如下:
title節點
lang節點  
Everyday節點
 author節點 
Giada De Laurentiis節點
 yearcom相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn