java使用XPath查詢xml節點
阿新 • • 發佈:2019-01-24
原文地址:http://outofmemory.cn/code-snippet/2778/java-usage-XPath-seek-xml-jiedian
java 程式碼,通過xpath 從xml檔案中查詢到節點,並可轉換成String輸出。
package cn.outofmemory.snippets.core;import java.io.File;import java.io.FileInputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.xpath.XPath;import javax.xml.xpath.XPathConstants;import javax.xml.xpath.XPathFactory;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;publicclassFindElementsByAbsoluteLocationWithXPath{publicstaticvoid main(String[] args)throwsException{DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setValidating(false);DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(newFileInputStream(newFile("in.xml")));XPathFactory factory =XPathFactory.newInstance();XPath xpath = factory.newXPath();String expression;Node node;NodeList nodeList;// 1. root element
expression ="/*";
node =(Node) xpath.evaluate(expression, doc,XPathConstants.NODE);System.out.println("1. "+ node.getNodeName());// 2. root element (by name)
expression ="/rss";
node =(Node) xpath.evaluate(expression, doc,XPathConstants.NODE);System.out.println("2. "+ node.getNodeName());// 3. element under rss
expression ="/rss/channel";
node =(Node) xpath.evaluate(expression, doc,XPathConstants.NODE);System.out.println("3. "+ node.getNodeName());// 4. all elements under rss/channel
expression ="/rss/channel/*";
nodeList =(NodeList) xpath.evaluate(expression, doc,XPathConstants.NODESET);System.out.print("4. ");for(int i =0; i < nodeList.getLength(); i++){System.out.print(nodeList.item(i).getNodeName()+" ");}System.out.println();// 5. all title elements in the document
expression ="//title";
nodeList =(NodeList) xpath.evaluate(expression, doc,XPathConstants.NODESET);System.out.print("5. ");for(int i =0; i < nodeList.getLength(); i++){System.out.print(nodeList.item(i).getNodeName()+" ");}System.out.println();// 6. all elements in the document except title
expression ="//*[name() != 'title']";
nodeList =(NodeList) xpath.evaluate(expression, doc,XPathConstants.NODESET);System.out.print("6. ");for(int i =0; i < nodeList.getLength(); i++){System.out.print(nodeList.item(i).getNodeName()+" ");}System.out.println();// 7. all elements with at least one child element
expression ="//*[*]";
nodeList =(NodeList) xpath.evaluate(expression, doc,XPathConstants.NODESET);System.out.print("7. ");for(int i =0; i < nodeList.getLength(); i++){System.out.print(nodeList.item(i).getNodeName()+" ");}System.out.println();// 8. all level-5 elements (the root being at level 1)
expression ="/*/*/*/*";
nodeList =(NodeList) xpath.evaluate(expression, doc,XPathConstants.NODESET);System.out.print("8. ");for(int i =0; i < nodeList.getLength(); i++){System.out.print(nodeList.item(i).getNodeName()+" ");}System.out.println();}}
將node 轉換成String 輸出
public static String NodetoString(Node node) {
Transformer transformer = null;
String result = null;
if (node == null) {
throw new IllegalArgumentException();
}
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
if (transformer != null) {
try {
StringWriter sw = new StringWriter();
transformer
.transform(new DOMSource(node), new StreamResult(sw));
return sw.toString();
} catch (TransformerException te) {
throw new RuntimeException(te.getMessage());
}
}
return result;
}
Input:
<?xml version="1.0" encoding="UTF-8"?><rssversion="2.0"><channel><title>Java Tutorials and Examples 2</title><language>en-us</language><item><title><![CDATA[Java Tutorials 2]]></title><link>http://www.javacodegeeks.com/</link></item><item><title><![CDATA[Java Examples 2]]></title><link>http://examples.javacodegeeks.com/</link></item></channel></rss>