XML的XPath解析方式
2016-06-27 18:20
239 查看
比如这样一段代码:
里面有很多相同的节点,但是这种节点用循环解析的方式是解析不出来的,至少现在我没有这种有效的办法。然后就搜到了用XPath这种解析方式。
首先要导入这几个包:
读取XML文件:
声明这个XPath,通过XPath找到要解析的节点。然后写到Excel表里。
我的例子比较复杂的话可以看一下下面这个:
<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()); } } }
相关文章推荐
- 观察者模式
- 空对象模式
- 晋城大医院结束总结
- 【持久层】java程序猿的JDBC知识点
- epool ref code
- 采用unity的update驱动的状态机模式注意事项
- ubuntu下词典的安装(StarDict)
- RxJava——创建 Observer
- 策略模式
- 计算机网络基础知识笔记(二)
- ios开发——日常之可用通知监听的系统事件
- 判断二叉树左右对称
- OpenCV : 基于切线方向的边缘增强算法
- 关于Ajax load页面中js部分$(function(){})的执行顺序
- 所以到底什么是 Growth Hacking?
- UIButton和UIIMageView的区别
- sed-流式编辑器
- redis系列笔记之数据结构SDS
- ViewPager + fragment + SlideTabLayout
- 爬取韩寒博客