XML的XPath解析方式

比如这样一段代码:
<RESULT>
<MEESAGES>
<MESSAGE>
<RECEIVERPHONE>18980826717</RECEIVERPHONE>
<SENTTIME>2016-06-22 11:23:31</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18980826717</RECEIVERPHONE>
<SENTTIME>2016-06-22 10:51:59</SENTTIME>
<TRADEWAY>2</TRADEWAY>
<RECEIVERPHONE>15528016702</RECEIVERPHONE>
<SENTTIME>2016-06-17 12:23:04</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>15528016702</RECEIVERPHONE>
<SENTTIME>2016-06-17 12:21:50</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18030782962</RECEIVERPHONE>
<SENTTIME>2016-06-15 00:16:49</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18030782962</RECEIVERPHONE>
<SENTTIME>2016-06-14 22:59:34</SENTTIME>
<TRADEWAY>2</TRADEWAY>
<RECEIVERPHONE>18030782962</RECEIVERPHONE>
<SENTTIME>2016-06-14 22:59:30</SENTTIME>
<TRADEWAY>2</TRADEWAY>
<RECEIVERPHONE>18030782962</RECEIVERPHONE>
<SENTTIME>2016-06-14 18:02:57</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18280338392</RECEIVERPHONE>
<SENTTIME>2016-06-12 10:52:59</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18620123797</RECEIVERPHONE>
<SENTTIME>2016-06-12 10:52:06</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>13766268687</RECEIVERPHONE>
<SENTTIME>2016-06-07 23:10:25</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18980826717</RECEIVERPHONE>
<SENTTIME>2016-06-06 15:30:16</SENTTIME>
<TRADEWAY>1</TRADEWAY>
<RECEIVERPHONE>18980826717</RECEIVERPHONE>
<SENTTIME>2016-06-06 14:52:21</SENTTIME>
<TRADEWAY>2</TRADEWAY>
<
</MESSAGE></MEESAGES>

里面有很多相同的节点,但是这种节点用循环解析的方式是解析不出来的,至少现在我没有这种有效的办法。然后就搜到了用XPath这种解析方式。
首先要导入这几个包:

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

读取XML文件:

        SAXReader saxReader = new SAXReader();
        SAXBuilder sb = new SAXBuilder();
        Document doc = null;
        try {
            doc = sb.build(new FileInputStream("E:\\demo.xml"));
        } catch (JDOMException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Element root = doc.getRootElement(); //读取根节点

声明这个XPath,通过XPath找到要解析的节点。然后写到Excel表里。

XPath RECEIVERPHONEPath = XPath.newInstance("/RESULT/MEESAGES/MESSAGE/RECEIVERPHONE");
        XPath SENTTIMEPath = XPath.newInstance("/RESULT/MEESAGES/MESSAGE/SENTTIME");
        XPath TRADEWAYPath = XPath.newInstance("/RESULT/MEESAGES/MESSAGE/TRADEWAY");
        List RECEIVERPHONElist = RECEIVERPHONEPath.selectNodes(root);
        List SENTTIMElist = SENTTIMEPath.selectNodes(root);
        List TRADEWAYlist = TRADEWAYPath.selectNodes(root);

        for (int i = 0; i < RECEIVERPHONElist.size(); i++) {
            Element RECEIVERPHONEElement = (Element) RECEIVERPHONElist.get(i);
            Element SENTTIMEElement = (Element) SENTTIMElist.get(i);
            Element TRADEWAYElement = (Element) TRADEWAYlist.get(i);
            XSSFRow RECEIVERPHONERow = sheet1.createRow((int) i+1);
            RECEIVERPHONERow.createCell(0).setCellValue(RECEIVERPHONEElement.getText());
            RECEIVERPHONERow.createCell(1).setCellValue(SENTTIMEElement.getText());
            RECEIVERPHONERow.createCell(2).setCellValue(TRADEWAYElement.getText());
        }

我的例子比较复杂的话可以看一下下面这个:

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

public class Xpather {
    public static void testXPath(String filePath) throws Exception {
        SAXBuilder sb = new SAXBuilder();
        Document doc = sb.build(new FileInputStream(filePath));
        Element root = doc.getRootElement(); //读取根节点
        //返回resume节点下的所有子节点
        XPath xPath = XPath.newInstance("/resume/*");
        //返回文档中所有preOccupation节点
        //XPath xPath = XPath.newInstance("//preOccupation");
        //返回/resume/wife/preOccupation这个节点
        //XPath xPath = XPath.newInstance("/resume/wife/preOccupation");
        //返回名字preOccupation有属性peroid的节点
        //XPath xPath = XPath.newInstance("/resume/wife/preOccupation[@period]");
        //返回文档中所有preOccupation节点,并且有属性period
        //XPath xPath = XPath.newInstance("//preOccupation[@period]");
        //返回名字为preOccupation属性period='5-18'的节点。
        //XPath xPath = XPath.newInstance("/resume/wife/preOccupation[@period='5-18']");
        //返回文档中所有preOccupation节点,并且文本内容为皇子
        //XPath xPath = XPath.newInstance("//preOccupation[text()='皇子']");
        List list = xPath.selectNodes(root);
        for (int i = 0; i < list.size(); i++) {
            Element e = (Element) list.get(i);
            System.out.println(e.getText());
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值