Java解析XML文件


Java解析XML文件

XML是什么

  • XML是可擴展標記語言(EXtensible Markup Language)
  • XML是一種標記語言(HTML也是標記語言)
  • XML是用來傳輸和存儲數據(HTML是用來顯示數據)

XML的語法規則

  • 所以XML元素都必須有關閉標簽
  • XML標簽是對大小寫敏感
  • XML必須正確的嵌套
  • 由於XML是樹形結構,所以必須有根元素
  • XML屬性值必須加引號

XML的應用場景

  • 作為系統或應用的配置文件使用
  • 作為應用程序的數據存儲文件或日志存儲文件
  • 數據庫的功能之一,支持XML存儲

Java解析XML的四種方法

Java解析分為兩類四種方法。

第一類是基礎方法:DOM解析和SAX解析

第二類是在基礎方法上擴展出來的方法:JDOM解析和DOM4J解析

基礎方法

DOM和SAX是兩種解析方法(沒有具體實現,只有接口),所有java自身提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser實現這兩個解析器(就是不需要添加額外的架包)

DOM解析

DOM(Document Object Model):文件對象模型,是W3C組織推薦的處理可擴展標志語言的標准編程接口。

DOM是與平台無關的官方解析方法。由W3C提供的接口,將整個XML文檔讀入,構建一個DOM樹來對各個節點進行操作。

SAX解析

SAX(Simple API for XML):XML簡單應用程序接口。

SAX是基於事件驅動的解析方法。是在讀取文檔時激活一系列事件,這些事件被推給事件處理器,然后由事件處理器提供對文檔內容的訪問。

SAX解析和DOM解析的對比

擴展方法

由於JDOM和DOM4J是擴展方法,所以Java本身是沒有的,需要添加相應的架包dom4j.jar和jdom.jar

JDOM解析

JDOM是處理XML的純JAVA API,API大量使用了Collection類,JDOM是使用具體類而不使用接口。

DOM4J解析

DOM4J是目前xml解析方面最優秀的(就是目前主流的),它合並了很多基本XML文檔表示的功能,包括集成的XPATH支持、XML Schema支持以及基於事件的處理。

.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <VALUE>
       <NO DATE="C005">A1</NO>
       <ADDR>A01</ADDR>
   </VALUE>
   <VALUE>
       <NO DATE="C004">A2</NO>
       <ADDR>A03</ADDR>
  </VALUE>
  <note>
    <NO DATE="C014">A4</NO>
     <ADDR>A09</ADDR>
  </note>
</Root>

.class解析如下:

import java.io.*;   
import java.util.*;
		//導入相應架包的API
import org.dom4j.*;
import org.dom4j.io.*;
public class DOM4Java 
{
   public static void main(String[] args)
   {
	   	// 解析demo.xml文件
		try { 
	     String path=DOM4Java.class.getClassLoader().getResource("").toString().substring(6);// 獲得絕對路徑 注意:我的xml是放在這個絕對路徑上的
		 File f= new File(path+"demo.xml"); 
		 // 創建SAXReader的對象reader
		 SAXReader reader = new SAXReader(); 
		 // 通過reader對象的read方法加載books.xml文件,獲取docuemnt對象。 
		 Document doc = reader.read(f); 
		 // 通過document對象獲取根節點root
		 Element root = doc.getRootElement(); 
		 System.out.println(root.getName());
		 // 通過element對象的elementIterator方法獲取迭代器
		 Iterator it = root.elementIterator("VALUE");//獲取root下所有value 子標簽
	     while(it.hasNext()) 
		  { 
			 Element foo = (Element) it.next(); //得到value
		     Element subfoo=foo.element("NO"); //獲取value 下NO 子標簽
		     System.out.print("車牌號碼:" + foo.elementText("NO")+" 屬性:"+subfoo.attributeValue("DATE")); 
		     System.out.println("城市編號:" + foo.elementText("ADDR")); 
		  }
	     	System.out.println("-----------------------------------");
	     	Element e=root.element("note");
	     	System.out.println(e.elementText("NO"));
	     
		  }catch (Exception e)
		  { 
		      e.printStackTrace(); 
		  } 
   }
}

結果如下:

Root
車牌號碼:A1 屬性:C005城市編號:A01
車牌號碼:A2 屬性:C004城市編號:A03
-----------------------------------
A4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM