a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 381|回复: 0

[专业语言] Java认证辅导之关于Java语言的XPathAPI(4)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导之关于Java语言的XPathAPI(4)* h; _4 p, u* l
% e# f4 y: t* O* Y6 m
清单 4. 用固定的 XPath 表达式查询 XML 文档的完整程序: J+ e) D2 _3 M+ w$ ^( a
4 ~: G; {/ l( W
import java.io.IOException; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.*; import javax.xml.xpath.*; public class XPathExample {   public static void main(String[] args)    throws ParserConfigurationException, SAXException,           IOException, XPathExpressionException {     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();     domFactory.setNamespaceAware(true); // never forget this!     DocumentBuilder builder = domFactory.newDocumentBuilder();     Document doc = builder.parse("books.xml");     XPathFactory factory = XPathFactory.newInstance();     XPath xpath = factory.newXPath();     XPathExpression expr      = xpath.compile("//book[author='Neal Stephenson']/title/text()");     Object result = expr.evaluate(doc, XPathConstants.NODESET);     NodeList nodes = (NodeList) result;     for (int i = 0; i < nodes.getLength(); i++) {         System.out.println(nodes.item(i).getNodeValue());     }   } } XPath 数据模型
$ `  N+ I7 n9 p每当混合使用诸如 XPath 和 Java 这样两种不同的语言时,必定会有某些将两者粘合在一起的明显接缝。并非一切都很合拍。XPath 和 Java 语言没有同样的类型系统。XPath 1.0 只有四种基本数据类型:
$ B& ?2 C! F2 @1 \/ o# T1 F- X4 P" n! v- @$ U
◆ node-set) b1 [4 E% a4 B7 O6 Y2 Q  ?$ _- X# |
◆ number
6 {) d3 D$ `7 ?. D( N! t- A; p◆ boolean
* G  I, K  \2 C, G3 e◆ string
0 L& y: F' N# f0 a8 y! s当然,Java 语言有更多的数据类型,包括用户定义的对象类型。: ?; ?* K( [. }) y! G/ R
多数 XPath 表达式,特别是位置路径,都返回节点集。但是还有其他可能。比如,XPath 表达式 count(//book) 返回文档中的图书数量。XPath 表达式 count(//book[@author="Neal Stephenson"]) > 10 返回一个布尔值:如果文档中 Neal Stephenson 的著作超过 10 本则返回 true,否则返回 false。
6 n3 @6 F, k1 L. ~evaluate() 方法被声明为返回 Object。实际返回什么依赖于 XPath 表达式的结果以及要求的类型。一般来说,XPath 的8 u9 b* N+ y! |. z( q8 ~; d
◆ number 映射为 java.lang.Double
+ [4 E$ l1 Q% k+ \: T9 t◆ string 映射为 java.lang.String
3 c/ n6 O. b9 y! w◆ boolean 映射为 java.lang.Boolean* }+ J. E9 o) i0 ?2 t2 o+ T
◆ node-set 映射为 org.w3c.dom.NodeList
6 Q) b; _# W; XXPath 2  i1 l1 L2 s6 [( `
前面一直假设您使用的是 XPath 1.0。XPath 2 大大扩展和修改了类型系统。Java XPath API 支持 XPath 2 所需的主要修改是为返回 XPath 2 新数据类型增加常量。
* Z. {% d, |3 m在 Java 中计算 XPath 表达式时,第二个参数指定需要的返回类型。有五种可能,都在 javax.xml.xpath.XPathConstants 类中命名了常量:5 f2 \; m- p% Q2 u
' o7 O& s8 u3 J7 o' ~; u
XPathConstants.NODESETXPathConstants.BOOLEANXPathConstants.NUMBERXPathConstants.STRINGXPathConstants.NODE最后一个 XPathConstants.NODE 实际上没有匹配的 XPath 类型。只有知道 XPath 表达式只返回一个节点或者只需要一个节点时才使用它。如果 XPath 表达式返回了多个节点并且指定了 XPathConstants.NODE,则 evaluate() 按照文档顺序返回第一个节点。如果 XPath 表达式选择了一个空集并指定了 XPathConstants.NODE,则 evaluate() 返回 null。
/ q1 z1 O# A; a' ^! M7 P如果不能完成要求的转换,evaluate() 将抛出 XPathException。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-20 18:23 , Processed in 0.262815 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表