1. 程式人生 > >dom4j解析xml基本方法以及當xml中存在名稱空間時的三種處理辦法

dom4j解析xml基本方法以及當xml中存在名稱空間時的三種處理辦法

使用SAXReader需要匯入dom4j-full.jar包。

     dom4j是一個Java的XML API,類似於jdom,用來讀寫XML檔案的。dom4j是一個非常非常優秀的Java XML API,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體,可以在SourceForge上找到它。

     使用舉例:

1.    s.xml內容

[xhtml] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="GB2312"?>
  2. <data>
  3. <rowqueryDTO.enterpriseId
    ="gfd"queryDTO.loginName="gdfg"queryDTO.state="0"/>
  4. </data>

2.解析

[c-sharp] view plaincopyprint?

import java.io.File;  

import java.io.FileInputStream;  

import java.io.FileNotFoundException;  

import java.util.Iterator;  

import java.util.List;  

import org.dom4j.Document;  

import org.dom4j.DocumentException;  

import org.dom4j.Element;  

import org.dom4j.io.SAXReader;  

import org.dom4j.tree.AbstractAttribute;  

publicclass ReadXMLTest {  

public

staticvoid main(String[] args){  

        File xmlFile = new File("C:/s.xml");  

        FileInputStream fis = null;  

try {  

            fis = new FileInputStream(xmlFile);  

        } catch (FileNotFoundException e) {  

            e.printStackTrace();  

            System.err.println("File is not exsit!");  

        }  

        SAXReader saxReader = new SAXReader();  

        List rowList = null;  

try {  

//生成文件對應實體

            Document doc = saxReader.read(fis);  

//獲取指定路徑下的元素列表,這裡指獲取所有的data下的row元素

            rowList = doc.selectNodes("//data/row");  

        } catch (DocumentException e) {  

            e.printStackTrace();  

        }  

for(Iterator iter = rowList.iterator();iter.hasNext();){  

//獲得具體的row元素 

            Element element = (Element)iter.next();  

//獲得row元素的所有屬性列表

            List elementList = element.attributes();  

for(Iterator iter1 = elementList.iterator();iter1.hasNext();){  

//將每個屬性轉化為一個抽象屬性,然後獲取其名字和值

                AbstractAttribute aa = (AbstractAttribute)iter1.next();  

                System.out.println("Name:"+aa.getName()+";Value:"+aa.getValue());  

            }  

//輸出:

//Name:queryDTO.enterpriseId;Value:gfd

//Name:queryDTO.loginName;Value:gdfg

//Name:queryDTO.state;Value:0

           System.out.println(element.getName());  

//輸出:

//row

// 取得row元素的queryDTO.enterpriseId屬性的值

            System.out.println(element.attributeValue("queryDTO.enterpriseId"));  

//輸出:

//gfd

//如果element下有子元素,(類似width="**"),要想獲得該子元素的值,可以用如下方法

            System.out.println(element.elementText("width"));//因為沒有,所以輸出為null。

        }  

    }  

}  

當你解析XML時,是否會因為名稱空間的存在而不能得償所願呢?
.net上的解決方法我就不多說了(.net有世界上最詳細的開發文件。這是我最欣賞微軟的地方
java方面,好多人推薦用dom4j處理xml,我也就說說在dom4j上處理帶名稱空間的xml

先說前兩個方法,是從網上看來的。(來自
http://blog.csdn.net/anyoneking/)摘抄如下:
xml程式碼example:

<report  xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.15" id="1"><list-property name="cssStyleSheets"><structure><property name="fileName">D: eport.css</property></structure></list-property></report>

第一個方案.設定你的xpath的名稱空間setNamespaceURIs

publicclass TransferXML {
    
publicstaticvoid
 main(String[] args) throws Exception{
        Map map 
=new
 HashMap();
        map.put(
"design","http://www.eclipse.org/birt/2005/design"
);
        SAXReader saxReader 
=new
 SAXReader();
        File file 
=new File("D:\test.xml"
);
        Document document 
=
 saxReader.read(file);
        XPath x 
= document.createXPath("//design:list-property"
);
        x.setNamespaceURIs(map);
        List nodelist 
=
 x.selectNodes(document);
        System.
out
.println(nodelist.size());
    }
}

第二個解決方案:設定你的DocumentFactory()的名稱空間 setXPathNamespaceURIs

publicclass TransferXML {
    
publicstaticvoid
 main(String[] args) throws Exception{
        Map map 
=new
 HashMap();
        map.put(
"design","http://www.eclipse.org/birt/2005/design"
);
        SAXReader saxReader 
=new
 SAXReader();
        File file 
=new File("D:\test.xml"
);
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        Document document 
=
 saxReader.read(file);
        List tmp 
= document.selectNodes("//design:list-property"
);
        System.
out
.println(tmp.size());
    }
}

第三種方法:本人用的,最笨也是最通用的方法,就是不使用開發環境給你提供的一系列物件,而是用XPath語法中自帶的local-name() 和 namespace-uri() 指定你要使用的節點名和名稱空間。
當你遇到使用xslt來樣式化xml時,就知道這個笨方法的好處了:

publicclass TransferXML {
    
publicstaticvoid
 main(String[] args) throws Exception
        SAXReader saxReader 
=new
 SAXReader();
        File file 
=new File("D:\test.xml"
);
        Document document 
=
 saxReader.read(file);
        List tmp 
= document.selectNodes("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']"
);
        System.
out
.println(tmp.size());
    }
}

相關推薦

xml存在名稱空間處理辦法dom4j

{         Map map  = new  HashMap();         map.put( " design " , " http://www.eclipse.org/birt/2005/design " );         SAXReader saxReader  = new  SAX

dom4j解析xml基本方法以及xml存在名稱空間處理辦法

使用SAXReader需要匯入dom4j-full.jar包。      dom4j是一個Java的XML API,類似於jdom,用來讀寫XML檔案的。dom4j是一個非常非常優秀的Java XML API,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體,可以在SourceFo

解決JSON Lib, XML轉JSON字串不要namespace,以及xml有Type屬性轉換成json會丟失問題

XMLSerializer xmlSerializer = new XMLSerializer(); JSON json = xmlSerializer.read(xml); return json.toString(3); 以上程式碼在xmll轉成json字串後,

[MyBatis] Mapper.xml名稱空間及命名解析

Mapper.xml相關使用 名稱空間(Namespaces) 名稱空間(Namespaces) 在之前版本的MyBatis中是可選的,這樣容易引起混淆因此毫無益處。現在名稱空間則是必須的,且易於簡單地用更長的完完全限定名來隔離語句。 名稱空間使得你所見到的介面繫結成為可能,

String與XML互轉以及XML取節點值並修改

讀取xml檔案生成Document物件 Document轉換成String型別串 String串轉成xml 已知xml節點取節點值 已知xml節點修改節點值 一個xml檔案: <?xml version="1.0" encoding="UTF-8"

【科技】原根的快速判斷方法以及對1求離散對數的另一想法

鑑於實際需要,本文中所選的模數$p$總是一個平凡質數,並用$\phi$表示$\phi (p) = p - 1$。 原根的定義: 基於$p$是質數,我們可以很簡單的把它的定義想成,如果一個數$a \in [0, p - 1]$是原根的充要條件是對於$x \in [0, p - 2]$,$a^{x}$互不相同

Flask --(24)資料庫的基本知識以及在 Flask 的使用概述

資料庫的簡單回顧 SQL(Structured Query Language):結構化查詢語言。 表形式儲存 列數固定 ,行數可變 定義資料,主鍵、外來鍵,引用同表或不同表的主鍵,這種聯絡稱為關係。 NoSQL:非結構化查詢語言。 不遵循關係型資料庫的統稱

java建立執行緒的方法以及區別

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒 下面

listview有點選事件的實現方法

1、首先在adapter中定義介面 private static OnAddClickListener onItemAddClick;//向activity傳值 //向activity傳值 pu

spring的xmlp名稱空間與C名稱空間簡化屬性賦值

p名稱空間與C名稱空間簡化屬性賦值 Spring給我們提供的一種比較簡便的方式來為我們的屬性賦值 P名稱空間用於簡化set方法的屬性賦值 C名稱空間用於簡化構造器的屬性賦值 第一步:加上我們的P名稱空間與C名稱空間 <?xml version="1.0" encodi

數據庫優化查詢的方法以及大訪問量到數據庫的優化

改變 條目 事務 安全保障 寫性能 垂直 where 內存 統計 一.數據庫優化查詢的方法 1.使用索引: 應盡量避免全表掃描,首先考慮在where 以及 order by ,group by 涉及的列上建立索引 2.優化SQL語句: 1>通過explai

Java從鍵盤輸入的方法

readline 鍵盤 輸入 exception nbsp stack clas system reader import java.io.BufferedReader; import java.io.IOException; import java.io.Input

Electron與jQuery$符號沖突的解決方法

jquer obj define export tro conf jquery blog ack   在Electron工程中引用jQuery時,經常會出現以下錯誤: Uncaught ReferenceError: $ is not defined   解決的具體方

頁面插入CSS樣式的方法

text 總結 聲明 特殊 優勢 color 應該 -c -- 頁面中插入css樣式的三種方法總結 1、 外部樣式 當樣式需要應用於很多頁面時,外部樣式表將是理想的選擇。在使用外部樣式表的情況下,你可以通過改變一個文件來改變整個站點的外觀。每個頁面使用<link>

對象的notify方法的含義和對象鎖釋放的情況

代碼塊 程序 退出 ont nbsp pos 狀態 線程等待 content 1,notify的含義 (1)notify一次只隨機通知一個線程進行喚醒 (2)在執行了notify方法之後,當前線程不會馬上釋放該對象鎖,呈wait狀態的線程也不能馬上獲得該對象鎖,

PHP遍歷數組有常用的方法

log jin 存儲 方法 執行 ron () ech ++ 在PHP中操作最多的數據估計也就是數組了,有著效率高、速度快、存儲方便的特點。 PHP中遍歷數組有三種常用的方法:1、for循環,用法最為靈活,靈活到懷疑人生,但記住格式也非常簡單。2、foreach,是PHP為

[轉]PHP開發涉及到emoji表情的處理方法

是個 lte .com ins tro 曲線 urn 往裏面 就是 最近幾個月做微信開發比較多,存儲微信昵稱必不可少,可這萬惡的微信支持emoji表情做昵稱,這就有點蛋疼了 一般Mysql表設計時,都是用UTF8字符集的。把帶有emoji的昵稱字段往裏面insert一下就沒

Eclipse安裝插件的方法

ons plugs soft new 文件夾 分隔 假設 clip oca Eclipse插件的安裝方法大體可以分為三種:直接復制、使用link文件,以及使用eclipse自帶的圖形界面的插件安裝方法。 一、使用link文件(建議使用) eclipse的安裝目錄:E:\

在VS新增lib庫的方法

在VS中新增lib庫的三種方法 注意: 1、每種方法也要複製相應的DLL檔案到相應目錄,或者設定DLL目錄的位置,具體方法為:"Properties" -> "Configuration Properties" -> "Deb

深度解析 Go 語言「切片」的特殊狀態

我們今天要來講一個非常細節的小知識,這個知識被大多數 Go 語言的開發者無視了,它就是切片的三種特殊狀態 —— 「零切片」、「空切片」和「nil 切片」。 切片被視為 Go 語言中最為重要的基礎資料結構,使用起來非常簡單,有趣的內部結構讓它成了 Go 語言面試中最為常見的考點。切片的底層是