比如这样一段代码:
<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());
}
}
}