您的位置:首页 > 其它

XML的XPath解析方式

2016-06-27 18:20 239 查看
比如这样一段代码:
<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());
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: