標籤:
Element root = document.getRootElement();
List recordenvlist = document.selectNodes("//gml:envelope"); //gml:envelope
提示 NoClassDefFoundError org.dom4j.DocumentFactory.createXPath 原因:dom4j的xpath api依賴jaxen完成解決方案:在系統中加入jaxen.jar.jaxen.jar下載路徑:http://jaxen.codehaus.org/releases.htmldom4j-1.6.1.jar下載路http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.jar
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
使用dom4j的xPath解析XML
一般的XML
國外的dom4j已經很流行了,國內的相關資料相對較少,但普及風暴也即將到來。我們公司(老外開的)解析XML就是用的dom4j。
今天公司沒事做,自己也寫一個小例子貼上來,嘻~~
Xml代碼
- books.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <books>
- <!--This is a test for dom4j, jakoes, 2007.7.19-->
- <book show="yes" url="lucene.net">
- <title id="456">Lucene Studing</title>
- </book>
- <book show="yes" url="dom4j.com">
- <title id="123">Dom4j Tutorials</title>
- </book>
- <book show="no" url="spring.org">
- <title id="789">Spring in Action</title>
- </book>
- <owner>O‘Reilly</owner>
- </books>
下面我們使用dom4j的xPath來解析:
Java代碼
- segment of ParseXML.java:
-
- public void parseBooks(){
-
- SAXReader reader = new SAXReader();
- try {
- Document doc = reader.read("books.xml");
- Node root = doc.selectSingleNode("/books");
- List list = root.selectNodes("book[@url=‘dom4j.com‘]");
-
- for(Object o:list){
-
- Element e = (Element) o;
- String show=e.attributeValue("show");
- System.out.println("show = " + show);
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
Document doc = reader.read("books.xml");的意思是載入XML文檔,此是可以用doc.asXML()來查看,它將列印整個xml文檔。
Node root = doc.selectSingleNode("/books");是讀取剛才載入的xml文檔內的books節點下的所有內容,對於本例也是整個xml文檔。
當然我們也可以載入/books下的某一個節點,如:book節點
Node root = doc.selectSingleNode("/books/book");
或:Node root = doc.selectSingleNode("/books/*");
注意:如果有多個book節點,它只會讀取第一個
root.asXML()將列印:
<book show="yes" url="lucene.net">
<title id="456">Lucene Studing</title>
</book>
既然載入了這麼多,那我怎麼精確的得到我想要的節點呢,別急,看下面:
List list = root.selectNodes("book[@url=‘dom4j.com‘]");
它的意思就是讀取books節點下的book節點,且book的節點的url屬性為dom4j.com
為什麼使用list來接收呢,如果有兩個book節點,且它們的url屬性都為dom4j.com,此時就封閉到list裡了。
如果想讀取books下的所有book節點,可以這樣:
List list = root.selectNodes("book");
如果想讀取books節點下的book節點下的title節點,可以這樣:
List list2 = root.selectNodes("book[@url=‘dom4j.com‘]/title[@id=‘123‘]");
注意:selectNodes()參數的格式:
節點名[@屬性名稱=‘屬性值‘],如:book[@url=‘dom4j.com‘]
如果有多個節點,用“/”分開,如:book[@url=‘dom4j.com‘]/title[@id=‘123‘]
最近就是讀取封閉在List裡的內容了,可以用Node來讀取,也可以用Element來轉換。
attributeValue("屬性")是讀取該節點的屬性值
getText()是讀取節點的的內容。
以上傳自。。。。sorry不記得了
要注意的是。在dom4j使用selectNodes等操作時要加上另一個包jaxen-1.1.1.jar
帶命名空間的XML
在XML根節點出現<outputdatas xmlns="XML">
或<root xmlns="www.xxx.com"> xmlns等於的就是命名空間了
因為dom4j不能識別帶命名空間的節點,所以在讀取帶命名空間的XML時,要在每個節點前加上命名空間,方法如下例子:
Java代碼
- Map nsMap = null;
- @SuppressWarnings("unchecked")
- public void readXml(String xml) throws DocumentException{
- Document doc = DocumentHelper.parseText(xml);
- nsMap = new HashMap();
-
- String defaultNamespace = doc.getRootElement().getNamespaceURI();
- nsMap.put("default", defaultNamespace);
- //建立解析路徑,就是在普通的解析路徑前加上map裡的key值
- XPath x = doc.createXPath("//default:outputdatas/default:results/"
- + "default:result[@set_id=‘201‘]"
- + "/default:row/default:col[@param_id=‘201001‘]");
- x.setNamespaceURIs(nsMap);
-
- List<Node> nodes = x.selectNodes(doc);
- Node node = x.selectSingleNode(doc);
- }
相信聰明的你。。一看就明白啦。。就不用注釋啦
轉自 http://lovell.iteye.com/blog/625662
帶命名空間的XML的dom4j應用<轉>