DOM4J+XPath 解析XML

来源:互联网 发布:bej48 知乎 编辑:程序博客网 时间:2024/06/10 05:11

获取XML文档中某个节点可以通过getChildren()方法,此方法是遍历全部的节点后,才返回要得到元素的集合。

当小点的xml文档此方法还可以,当xml文档中含有大量的节点,效率是不是很低呀!!!

现在用DOM4J+XPath来解析大文档XML。

环境搭建:1:dom4j   2:jaxen.1.1.1.jar

Url.xml

  此xml是抓取的Google首页上的所有链接。

 <?xml version="1.0" encoding="UTF-8"?>
<url>
 <link id="0">
  <name>网页</name>
  <url>http://www.google.cn/webhp?hl=zh-CN&amp;tab=iw</url>
 </link>
 <link id="1">
  <name>视频</name>
  <url>http://video.google.cn/?hl=zh-CN&amp;tab=iv</url>
 </link>
 <link id="2">
  <name>地图</name>
  <url>http://ditu.google.cn/maps?hl=zh-CN&amp;tab=il</url>
 </link>
 <link id="3">
  <name>资讯</name>
  <url>http://news.google.cn/nwshp?hl=zh-CN&amp;tab=in</url>
 </link>
 <link id="4">
  <name>音乐</name>
  <url>http://www.google.cn/music?hl=zh-CN&amp;tab=iU</url>
 </link>
 <link id="5">
  <name>财经</name>
  <url>http://www.google.cn/finance?hl=zh-CN&amp;tab=ie</url>
 </link>
 <link id="6">
  <name>&lt;u&gt;更多&lt;/u&gt; &amp;raquo;</name>
  <url>http://www.google.cn/intl/zh-CN/options/</url>
 </link>
 <link id="7">
  <name>登录</name>
  <url>
   https://www.google.com/accounts/Login?hl=zh-CN&amp;continue=http://images.google.cn/
  </url>
 </link>
 <link id="8">
  <name />
  <url />
 </link>
 <link id="9">
  <name>高级图片搜索</name>
  <url>
   http://images.google.cn/advanced_image_search?hl=zh-CN
  </url>
 </link>
 <link id="10">
  <name>使用偏好</name>
  <url>http://images.google.cn/preferences?hl=zh-CN</url>
 </link>
 <link id="11">
  <name>潮流女星</name>
  <url>
   http://images.google.cn/imgcat?hl=zh-CN&amp;amp;num=10&amp;amp;newwindow=1&amp;amp;output=search&amp;amp;ie=UTF-8&amp;amp;cid=2&amp;amp;sa=h&amp;amp;seq=2_6_7_5_1
  </url>
 </link>
 <link id="12">
  <name>精美壁纸</name>
  <url>
   http://images.google.cn/imgcat?hl=zh-CN&amp;amp;num=10&amp;amp;newwindow=1&amp;amp;output=search&amp;amp;ie=UTF-8&amp;amp;cid=6&amp;amp;sa=h&amp;amp;seq=2_6_7_5_1
  </url>
 </link>
 <link id="13">
  <name>爆笑趣图</name>
  <url>
   http://images.google.cn/imgcat?hl=zh-CN&amp;amp;num=10&amp;amp;newwindow=1&amp;amp;output=search&amp;amp;ie=UTF-8&amp;amp;cid=7&amp;amp;sa=h&amp;amp;seq=2_6_7_5_1
  </url>
 </link>
 <link id="14">
  <name>游戏动漫</name>
  <url>
   http://images.google.cn/imgcat?hl=zh-CN&amp;amp;num=10&amp;amp;newwindow=1&amp;amp;output=search&amp;amp;ie=UTF-8&amp;amp;cid=5&amp;amp;sa=h&amp;amp;seq=2_6_7_5_1
  </url>
 </link>
 <link id="15">
  <name>生活时尚</name>
  <url>
   http://images.google.cn/imgcat?hl=zh-CN&amp;amp;num=10&amp;amp;newwindow=1&amp;amp;output=search&amp;amp;ie=UTF-8&amp;amp;cid=1&amp;amp;sa=h&amp;amp;seq=2_6_7_5_1
  </url>
 </link>
 <link id="16">
  <name>广告计划</name>
  <url>http://images.google.cn/intl/zh-CN/ads/</url>
 </link>
 <link id="17">
  <name>Google 大全</name>
  <url>http://images.google.cn/intl/zh-CN/about.html</url>
 </link>
 <link id="18">
  <name>ICP证合字B2-20070004号</name>
  <url>http://www.miibeian.gov.cn/</url>
 </link>
 <link id="19">
  <name />
  <url />
 </link>
</url>

TestDOM4JXpath.java

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class DOM4JXpath {
   public void parseXmlSimple(String fileName){
    SAXReader reader = new SAXReader();
    File file = new File(fileName);
    try {
   /*   是读取刚才加载的xml文档内的url根节点下的所有内容,
    *   当然我们也可以加载/url下的某一个节点,如:link节点
          *    Node root = doc.selectSingleNode("/url/link");
          *    或:Node root = doc.selectSingleNode("/url/*");
          *    注意:如果有多个link节点,它只会读取第一个
    * */ 
  Document document = reader.read(file);
  /*
   * 注意:selectNodes()参数的格式:
         *  节点名[@属性名='属性值'],如:link[@id='17']
         *  如果有多个节点,用“/”分开,如:link[@id='17']/title[@id='123']
   * */
  Node root = document.selectSingleNode("/url");
  List list = root.selectNodes("link[@id='17']/name");
  /*
   * 读取url节点下的link节点,且link的节点的id属性为17
         * 为什么使用list来接收呢,如果有两个link节点,且它们的id属性都为17,此时就封闭到list里了
         * 如果想读取url下的所有link节点,可以这样:
         * List list = root.selectNodes("link");
   * */
  for(Object object:list){
   Element element= (Element)object;
   String name = element.getText();
   System.out.println(name);
  }
  list = root.selectNodes("link[@id='17']/url");
  Iterator it = list.iterator();
  if(it.hasNext()){
   Element element = (Element)it.next();
   String url = element.getText();
   System.out.println("url "+url);
  }
 } catch (DocumentException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
   }
   public static void main(String args[]){
    TestDOM4JXpath dx = new TestDOM4JXpath();
    long start = System.currentTimeMillis();
    dx.parseXmlSimple("url.xml");
    String time = (System.currentTimeMillis() - start)+" MS";
    System.out.println(time);
    
   }
}