(七)使用XPath对象查询xml文档
XPath,一种为查询 XML 文档而设计的查询语言。XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。Java 5 推出了 javax.xml.xpath 包,提供一个引擎和对象模型独立的 XPath 库。
在 Java 中计算 XPath 表达式时,第二个参数指定需要的返回类型。有五种可能,都在javax.xml.xpath.XPathConstants 类中命名了常量:
- XPathConstants.NODESET
- XPathConstants.BOOLEAN
- XPathConstants.NUMBER
- XPathConstants.STRING
- XPathConstants.NODE
测试代码:
1 public class XPathTest { 2 /** 3 * 使用不带命名空间的XPath查询 4 * @throws Exception 5 */ 6 @Test 7 public void testRetrieveOndNode() throws Exception{ 8 //获得xml文档的内存模型 9 DocumentBuilder builder = DocumentBuilderFactory 10 .newInstance().newDocumentBuilder(); 11 Document document = builder.parse(new File("src/main/resource/books.xml")); 12 //创建XPathFactory对象 13 XPathFactory xPathFactory = XPathFactory.newInstance(); 14 //获得XPath对象 15 XPath xPath = xPathFactory.newXPath(); 16 //创建XPath表达式对象 17 XPathExpression nodeExpr = xPath.compile("//book[1]"); 18 //执行XPath表达式,因为该表达式只能获得一个节点,所以用XPathConstants.NODE 19 Element element = (Element) nodeExpr.evaluate(document, XPathConstants.NODE); 20 NodeList nodes = element.getChildNodes(); 21 for(int i=0;i<nodes.getLength();i++){ 22 Node node = nodes.item(i); 23 //获得节点类型 24 short nodeType = node.getNodeType(); 25 if(nodeType==Node.ELEMENT_NODE){ 26 //获得节点文本,getNodeValue()无法获得节点的文本 27 String text=node.getTextContent(); 28 System.out.println(node.getNodeName()+"--"+text); 29 } 30 } 31 } 32 }