Xpath 是一种比较好用的xml文档解析工具。相比较于DOM和SAX,Xpath主要用于在解析之前已经知道要解析的的节点名称和属性(貌似其他两种也是呀)。
1.节点类型
XPath中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。文档中存在元素节点,属性节点,根节点
2.常用路径表达式
表达式 | 描述 |
节点名称(nodename) | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
示例如下:
//@lang | 选取所有名为 lang 的属性 |
3.限定语
用来查找某个特定的节点或者包含某个指定的值的节点。以方括号括起
//book[price>35.00] | 选择所有book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。 |
4 .通配符
通配符 | 描述 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
| | 选取若干路径 |
使用示例 | |
路径表达式 | 结果 |
/bookstore/* | 选取 bookstore 元素的所有子节点 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取所有带有属性的 title 元素。 |
//book/title | //book/price | 选取所有 book 元素的 tilte 和 price 元素。 |
//title | //price | 选取所有文档中的 title 和 price 元素。 |
/bookstore/book/title | //price | 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素 |
有个问题。
XPathConstants
这个类的具体作用是什么?
不管了,等用到再说吧。
package per.XMLFileParse; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.File; /** * Created by li on 2016/11/14. * 解析xml文件的工具类。 */ public class XMLParser { private String path; /** * 构造器,要解析xml文档,首先必须先指导xml文档在哪吧。 */ public XMLParser(String path) { this.path = path; } /** * 传入一个xml文件的路径,获取Document对象 * param path; xml 文件路径。 * return document xml 的树节点对象。 **/ static Document getDocument(String path) { Document document = null; try { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setValidating(false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); document = documentBuilder.parse(new File(path)); } catch (Exception e) { System.out.println("获取xml文档节点失败。"); } return document; } /** * 创建一个用于解析文档的xpath对象的方法。 * param ;null * return XPath对象 */ static XPath getXPath() { XPathFactory xPathFactory = XPathFactory.newInstance(); return xPathFactory.newXPath(); } public static void main(String[] args) { Node node = getSpecifyNode("G:\\completeTheAim\\god\\MyProject\\src\\main\\java\\per\\myproject\\interaction\\set_hi_wtgl_fjxx.xml", "/service/inpoutData/vo"); System.out.println(node.hasChildNodes()); NamedNodeMap namedNodeMap = node.getAttributes(); System.out.println(namedNodeMap.item(1).getNodeValue()); System.out.println(namedNodeMap.getLength()); } /** * 工具方法,用于xml文档的获取根元素。 */ static Node getRootNode(String path) { Document document = getDocument(path); XPath xPath = getXPath(); Node node = null; try { node = (Node) xPath.evaluate("/*", document, XPathConstants.NODE); } catch (XPathExpressionException e) { System.out.println("获取xml文档根节点失败。"); } return node; } /** * 输入xml文件的path和文档中指定路径,获得那个节点。 * param:filePath xml文件路径 * param:nodePath 节点路径 * return:node 指定path的node */ static Node getSpecifyNode(String filePath, String nodePath) { Document document = getDocument(filePath); XPath xPath = getXPath(); Node node = null; try { node = (Node) xPath.evaluate(nodePath, document, XPathConstants.NODE); } catch (XPathExpressionException e) { System.out.println("获取xml文档根节点失败。"); } return node; } }
<?xml version="1.0" encoding="UTF-8"?> <service class="com.hi.problem.service.PM_GET_XMXX"> <inpoutData> <vo type="HI_WTGL_XMXX" name="in" /> </inpoutData> <outputData> <vo type="HI_WTGL_XMXX" name="out" /> </outputData> </service>