使用dom4j parsing xml
這裡是用dom4j去parse XML的資料...首先可以先到http://www.dom4j.org/dom4j-1.6.1/ 或是 http://dom4j.sourceforge.net/dom4j-1.6.1/download.html
下載使用,目前應該是用1.6.1的版本
然後,還需要下面的jaxen
http://jaxen.codehaus.org/releases.html
目前應該是1.1.4版本
用Yahoo的RSS來實作範例
Dom4jTest.java
package fux.xml.dom4j;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
private static Element root;
private static List<String> name = new ArrayList<String>();
private static Document document;
public static void main(String args[]){
// 建立連線的物件
URLConnectionUtil urlc = new URLConnectionUtil() ;
// URL
String urlStr = "http://hk.news.yahoo.com/rss/business/rss.xml";
Map<String,Object> map = new HashMap<String,Object>();
InputStream res = null ;
try {
// 連線取得資料
res = URLConnectionUtil.doGet(urlStr, map);
// 讀取XML檔案
SAXReader reader = new SAXReader();
document = reader.read(res);
// 取得XML Root Node
root = document.getRootElement();
// Root Node NAME
System.out.println( root.getName() );
System.out.println( );
// 印出所有XML DATA
printXMLTree();
// print data => /rss/channel/item/title
name = getAllDataByPath("/rss/channel/item/title");
}catch (Exception e) {
}
}
/** print all xml data */
public static void printXMLTree(){
printElement(root, 0);
return;
}
private static void printElement(Element element, int level){
// 依照階層print
for(int i = 0; i < level; i++){
System.out.print("\t");
}
System.out.print( "<" + element.getQualifiedName() + ">" );
// 取得該TAG的Attr
List attributes = element.attributes();
for(int i = 0; i < attributes.size(); i++){
Attribute a = ((Attribute)attributes.get(i));
System.out.print(" (Attr:\"" + a.getName() + "\"==" + a.getValue() + ")");
}
System.out.println( " "+element.getTextTrim());
Iterator iter = element.elementIterator();
while(iter.hasNext()){
Element sub = (Element)iter.next();
printElement(sub, level+1 );
}
return;
}
/** 從指定的檔案路徑 讀取XML檔案 */
public static Document loadXMLFile(String filename) {
Document document = null;
try {
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(filename));
}
catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
/** 依照Path 印出所有data
* example: String path="/rss/channel/item/title"
* @param path
*/
public static List<String> getAllDataByPath( String path ){
List<String> data = new ArrayList<String>();
Iterator it = document.selectNodes( path ).iterator();
while(it.hasNext()) {
Element ele = (Element)it.next();
System.out.println( path + " = "+ele.getStringValue());
data.add(ele.getStringValue());
}
return data;
}
}
範例程式裡面用到了...URLConnectionUtil urlc = new URLConnectionUtil();
可以從 URLConnectionUtil.java 取得。需要Include dom4j + jaxen 這兩個jar!
讀取XML檔案、指向XML的第一個Tag:
讀取XML檔案區要用到 org.dom4j.io.SAXReader 裡面的 read( InputStream is );
將檔案存到org.dom4j.Document document,
然後用 root = document.getRootElement(); 取得XML的第一個TAG,
可以把 root 相關的資訊print出來:
System.out.println( root.getName() );
印出XML所有的Tag、Attribute、Data:
這裡是用了下面這行來印出xml的所有資料:
printXMLTree();
其中要從 root 節點開始往下一個個跑,所以需要剛剛這行 root = document.getRootElement();
這是把該Tag裡面,所有的Attribute印出來:
List<String> data = new ArrayList<String>();
Iterator it = document.selectNodes( path ).iterator();
while(it.hasNext()) {
Element ele = (Element)it.next();
System.out.println( path + " = "+ele.getStringValue());
data.add(ele.getStringValue());
}
指定路徑,取得該TAG:
以下這行,表是用指定的路徑來指定該TAG:
name = getAllDataByPath("/rss/channel/item/title");
這個字串path是用到xpath,這就是jaxen裡的東西了,
List<string> data = new ArrayList<string>();
Iterator it = document.selectNodes( path ).iterator();
while(it.hasNext()) {
Element ele = (Element)it.next();
System.out.println( path + " = "+ele.getStringValue());
data.add(ele.getStringValue());
}
...
先寫到這裡,有其它的會再補上來!
沒有留言:
張貼留言