使用dom4j的xPath解析XML

books.xml:
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <books>  
  3.     <!--This is a test for dom4j, jakoes, 2007.7.19-->  
  4.     <book show="yes" url="lucene.net">  
  5.         <title id="456">Lucene Studing</title>  
  6.     </book>  
  7.     <book show="yes" url="dom4j.com">  
  8.         <title id="123">Dom4j Tutorials</title>  
  9.     </book>  
  10.     <book show="no" url="spring.org">  
  11.         <title id="789">Spring in Action</title>  
  12.     </book>  
  13.     <owner>O'Reilly</owner>  
  14. </books>  


下面我们使用dom4j的xPath来解析:

segment of ParseXML.java:

   
Java代码   收藏代码
  1. public void parseBooks(){  
  2.          
  3.         SAXReader reader = new SAXReader();  
  4.         try {  
  5.             Document doc = reader.read("books.xml");  
  6.             Node root = doc.selectSingleNode("/books");  
  7.             List list = root.selectNodes("book[@url='dom4j.com']");  
  8.              
  9.             for(Object o:list){  
  10.                  
  11.                 Element e = (Element) o;  
  12.                 String show=e.attributeValue("show");  
  13.                 System.out.println("show = " + show);  
  14.             }  
  15.             
  16.         } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  


  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()是读取节点的的内容。

可参考:
http://blog.csdn.net/qq_29663071/article/details/51304373

下面介绍一个复杂一点的例子,通过请求,从服务器传回一串xml格式的字符串,然后再parse方法中解析,就得到了TermInfo对象实例。
服务器传回的字符串如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?><message><head><messageId>20100707163000062</messageId><result>0000</result><encryptionType>0</encryptionType><md>a4820454be3b0bcc42cb62884a8ef44e</md></head><body><termInfo winTermNo=\"10077\" preTermNo=\"\"><lotteryResult>0607091724|0212</lotteryResult><missCount >10,29,3,4,5,0,0,12,0,2,4,1,12,7,11,1,0,8,1,3,11,11,2,0,5,6,2,7,8,4,14,3,17,9,1|4,0,5,28,2,9,2,8,8,5,4,0</missCount ><limitNumber ></limitNumber ><salesVolume >51385724</salesVolume ><jackpot >68192388.87</jackpot ><winResult><win id=\"1\"><winCount>0</winCount><winMoney>0</winMoney><winAddCount>0</winAddCount><winAddMoney>0</winAddMoney></win><win id=\"2\"><winCount>3</winCount><winMoney>1018831</winMoney><winAddCount>1</winAddCount><winAddMoney>611298</winAddMoney></win><win id=\"3\"><winCount>38</winCount><winMoney>22364</winMoney><winAddCount>5</winAddCount><winAddMoney>13418</winAddMoney></win><win id=\"4\"><winCount>40</winCount><winMoney>3000</winMoney><winAddCount>9</winAddCount><winAddMoney>1500</winAddMoney></win><win id=\"5\"><winCount>1473</winCount><winMoney>600</winMoney><winAddCount>464</winAddCount><winAddMoney>300</winAddMoney></win><win id=\"6\"><winCount>6540</winCount><winMoney>100</winMoney><winAddCount>1573</winAddCount><winAddMoney>50</winAddMoney></win><win id=\"7\"><winCount>69490</winCount><winMoney>10</winMoney><winAddCount>18273</winAddCount><winAddMoney>5</winAddMoney></win><win id=\"8\"><winCount>832924</winCount><winMoney>5</winMoney></win></winResult><term termNo=\"10078\"><termStatus>1</termStatus><winStatus>1</winStatus><saleStatus>1</saleStatus><startTime></startTime><deadLine>20100707193000</deadLine><deadLine2>20100707190000</deadLine2><winLine>20100707220000</winLine><startTime2></startTime2><deadLine3>20100707200000</deadLine3><winLine2>20100707220000</winLine2><changeLine>20100905220000</changeLine><reserve></reserve></term></termInfo></body></message>

解析如下:
Java代码   收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import java.util.TreeMap;  
  6.   
  7. import org.dom4j.Document;  
  8. import org.dom4j.DocumentException;  
  9. import org.dom4j.DocumentHelper;  
  10. import org.dom4j.Element;  
  11. import com.tlt.app.util.Constants;  
  12. /** 
  13.  * 当前在售期彩期信息 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class TermInfo extends BaseModel{  
  18.   
  19.     private Head head;  
  20.     /*选填,最近一期开奖期号*/  
  21.     private String winTermNo;  
  22.     /*选填,最近一期预售期号*/  
  23.     private String preTermNo;  
  24.     /*最近开奖结果*/  
  25.     private String lotteryResult;  
  26.     /*遗漏信息*/  
  27.     private String missCount;  
  28.     /*限号信息*/  
  29.     private String limitNumber;  
  30.     /*上期销量*/  
  31.     private String salesVolume;  
  32.     /*奖池滚存*/  
  33.     private String jackpot;  
  34.     /*最近开奖奖级结果*/  
  35.     private WinResult winResult;  
  36.     /*正在销售彩期信息*/  
  37.     private Term term;  
  38.     /*保留*/  
  39.     private String reserve;  
  40.     /*出错信息*/  
  41.     private String errorMsg;  
  42.     /*球队*/  
  43.     private List<GameInfo> gameInfo;  
  44.     public List<GameInfo> getGameInfo() {  
  45.         return gameInfo;  
  46.     }  
  47.     public void setGameInfo(List<GameInfo> gameInfo) {  
  48.         this.gameInfo = gameInfo;  
  49.     }  
  50.     public String getWinTermNo() {  
  51.         return winTermNo;  
  52.     }  
  53.     public void setWinTermNo(String winTermNo) {  
  54.         this.winTermNo = winTermNo;  
  55.     }  
  56.     public String getPreTermNo() {  
  57.         return preTermNo;  
  58.     }  
  59.     public void setPreTermNo(String preTermNo) {  
  60.         this.preTermNo = preTermNo;  
  61.     }  
  62.     public String getErrorMsg() {  
  63.         return errorMsg;  
  64.     }  
  65.     public void setErrorMsg(String errorMsg) {  
  66.         this.errorMsg = errorMsg;  
  67.     }  
  68.     public Head getHead() {  
  69.         return head;  
  70.     }  
  71.     public void setHead(Head head) {  
  72.         this.head = head;  
  73.     }  
  74.     public String getLotteryResult() {  
  75.         return lotteryResult;  
  76.     }  
  77.     public void setLotteryResult(String lotteryResult) {  
  78.         this.lotteryResult = lotteryResult;  
  79.     }  
  80.     public String getMissCount() {  
  81.         return missCount;  
  82.     }  
  83.     public void setMissCount(String missCount) {  
  84.         this.missCount = missCount;  
  85.     }  
  86.     public String getLimitNumber() {  
  87.         return limitNumber;  
  88.     }  
  89.     public void setLimitNumber(String limitNumber) {  
  90.         this.limitNumber = limitNumber;  
  91.     }  
  92.     public String getSalesVolume() {  
  93.         return salesVolume;  
  94.     }  
  95.     public void setSalesVolume(String salesVolume) {  
  96.         this.salesVolume = salesVolume;  
  97.     }  
  98.     public String getJackpot() {  
  99.         return jackpot;  
  100.     }  
  101.     public void setJackpot(String jackpot) {  
  102.         this.jackpot = jackpot;  
  103.     }  
  104.     public WinResult getWinResult() {  
  105.         return winResult;  
  106.     }  
  107.     public void setWinResult(WinResult winResult) {  
  108.         this.winResult = winResult;  
  109.     }  
  110.     public Term getTerm() {  
  111.         return term;  
  112.     }  
  113.     public void setTerm(Term term) {  
  114.         this.term = term;  
  115.     }  
  116.     public String getReserve() {  
  117.         return reserve;  
  118.     }  
  119.     public void setReserve(String reserve) {  
  120.         this.reserve = reserve;  
  121.     }  
  122.     @Override  
  123.     public boolean parse(String xmlString) {  
  124.         // TODO Auto-generated method stub  
  125.         try {  
  126.             Document document = DocumentHelper.parseText(xmlString);  
  127.             Head head=new Head();  
  128.             head.setMessageId(document.selectSingleNode("//message/head/messageId").getText());  
  129.             head.setResult(document.selectSingleNode("//message/head/result").getText());  
  130.             head.setEncryptionType(document.selectSingleNode("//message/head/encryptionType").getText());  
  131.             head.setMd(document.selectSingleNode("//message/head/md").getText());  
  132.             setHead(head);  
  133.             //如果返回失败信息,就没必要继续解析了  
  134.             if(!head.getResult().equals(Constants.SUCCESS)){  
  135.                 setErrorMsg(document.selectSingleNode("//message/head/result").getText()+":"+document.selectSingleNode("//message/body/errorMsg").getText());  
  136.                 return false;  
  137.             }  
  138.             setWinTermNo(document.selectSingleNode("//message/body/termInfo/@winTermNo").getText());  
  139.             setPreTermNo(document.selectSingleNode("//message/body/termInfo/@preTermNo").getText());  
  140.             setLotteryResult(document.selectSingleNode("//message/body/termInfo/lotteryResult").getText());  
  141.             setMissCount(document.selectSingleNode("//message/body/termInfo/missCount").getText());  
  142.             setLimitNumber(document.selectSingleNode("//message/body/termInfo/limitNumber").getText());  
  143.             setSalesVolume(document.selectSingleNode("//message/body/termInfo/salesVolume").getText());  
  144.             setJackpot(document.selectSingleNode("//message/body/termInfo/jackpot").getText());  
  145.             winResult=new WinResult();  
  146.             Map<String,Win> winMap=new TreeMap<String,Win>();//需要排序  
  147.             List list = document.selectNodes("//message/body/termInfo/winResult/win");  
  148.             for (Iterator iter = list.iterator(); iter.hasNext();) {  
  149.                 Win win=new Win();  
  150.                 Element winEle=(Element)iter.next();  
  151.                 win.setWinCount(winEle.element("winCount").getText());  
  152.                 win.setWinMoney(winEle.element("winMoney").getText());  
  153.                 if(winEle.element("winAddCount")!=null){//8等奖没有追加  
  154.                     win.setWinAddCount(winEle.element("winAddCount").getText());  
  155.                     win.setWinAddMoney(winEle.element("winAddMoney").getText());  
  156.                 }else{  
  157.                     win.setWinAddCount("");  
  158.                     win.setWinAddMoney("");  
  159.                 }  
  160.                 String id=winEle.attribute("id").getValue();  
  161.                 win.setId(id);  
  162.                 winMap.put(id,win);  
  163.             }  
  164.             winResult.setWin(winMap);  
  165.             setWinResult(winResult);  
  166.               
  167.             Term term=new Term();  
  168.             term.setTermNo(document.selectSingleNode("//message/body/termInfo/term/@termNo").getText());  
  169.             term.setTermStatus(document.selectSingleNode("//message/body/termInfo/term/termStatus").getText());  
  170.             term.setWinStatus(document.selectSingleNode("//message/body/termInfo/term/winStatus").getText());  
  171.             term.setSaleStatus(document.selectSingleNode("//message/body/termInfo/term/saleStatus").getText());  
  172.             term.setStartTime(document.selectSingleNode("//message/body/termInfo/term/startTime").getText());  
  173.             term.setDeadLine(document.selectSingleNode("//message/body/termInfo/term/deadLine").getText());  
  174.             term.setDeadLine2(document.selectSingleNode("//message/body/termInfo/term/deadLine2").getText());  
  175.             term.setWinLine(document.selectSingleNode("//message/body/termInfo/term/winLine").getText());  
  176.             term.setStartTime2(document.selectSingleNode("//message/body/termInfo/term/startTime2").getText());  
  177.             term.setDeadLine3(document.selectSingleNode("//message/body/termInfo/term/deadLine3").getText());  
  178.             term.setWinLine2(document.selectSingleNode("//message/body/termInfo/term/winLine2").getText());  
  179.             term.setChangeLine(document.selectSingleNode("//message/body/termInfo/term/changeLine").getText());  
  180.             term.setReserve(document.selectSingleNode("//message/body/termInfo/term/reserve").getText());  
  181.             setTerm(term);  
  182.               
  183.             List list_gameInfo = document.selectNodes("//message/body/termInfo/term/gameInfo/game");  
  184.             gameInfo=new ArrayList<GameInfo>();  
  185.             for (Iterator iter = list_gameInfo.iterator(); iter.hasNext();) {  
  186.                 GameInfo info=new GameInfo();  
  187.                 Element gameInfoEle=(Element)iter.next();  
  188.                 info.setId(gameInfoEle.attributeValue("id"));  
  189.                 info.setHomeTeam(gameInfoEle.element("homeTeam").getText());  
  190.                 info.setAwayTeam(gameInfoEle.element("awayTeam").getText());  
  191.                 info.setGameDate(gameInfoEle.element("gameDate").getText());  
  192.                 info.setLeagueMatch(gameInfoEle.element("leagueMatch").getText());//巴甲  
  193.                 info.setReserve(gameInfoEle.element("reserve").getText());  
  194.                 gameInfo.add(info);  
  195.             }  
  196.             setGameInfo(gameInfo);  
  197.         } catch (DocumentException e) {  
  198.             // TODO Auto-generated catch block  
  199.             e.printStackTrace();  
  200.             return false;  
  201.         }  
  202.         return true;  
  203.     }  
  204.       
  205. }  



<![CDATA[你的有特殊字符的内容]]>,比如:
<message><![CDATA[salary<1000]]></message>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值