`

采用JDK自带的类库解析XML(转)

阅读更多


1,需求说明
假设要查询一个图书列表,寻找TEST的著作. 

2,创建项目 
创建一个Java项目. 

Java 1.5推出了javax.xml.xpath包,提供一个引擎和对象模型独立的XPath库.只要Java环境>1.5,无需增加类库. 

这个包也可用于Java 1.3及以后的版本,但需要单独安装Java API for XML Processing(JAXP)1.3 

提示:Xalan 2.7 和Saxon 8 以及其他产品包含了这个库的实现. 

3,创建包含图书信息的XML文档
编写包含图书信息的XML文档,将其命名为books.xml,并将其放至在src目录下:

Java代码

  1. <inventory>  
  2.         <book year="2000">  
  3.                 <title>Thinking in Java</title>  
  4.                 <author>TEST</author>  
  5.                 <publisher>JQGYCBS</publisher>  
  6.                 <isbn>80958</isbn>  
  7.                 <price>98.95</price>  
  8.         </book>  
  9.   
  10.         <book year="2005">  
  11.                 <title>ROR</title>  
  12.                 <author>TEST</author>  
  13.                 <publisher>DZGYCBS</publisher>  
  14.                 <isbn>0743416910</isbn>  
  15.                 <price>65.99</price>  
  16.         </book>  
  17.   
  18.         <book year="1995">  
  19.                 <title>H</title>  
  20.                 <author>King</author>  
  21.                 <publisher>Sc</publisher>  
  22.                 <isbn>0553862</isbn>  
  23.                 <price>77.50</price>  
  24.         </book>  
  25. </inventory>  


4,XPath表达式的使用介绍
查找所有图书的 XPath 查询非常简单:

Java代码

  1. //book[author="TEST"]  
  2.  book代表节点的名称,author属性的名称,后面是要查询的值  


为了找出这些图书的标题(title),只要增加一步,表达式就变成了:

Java代码

  1. //book[author="TEST"]/title  
  2.  title代表要取元素的名称  


最后,真正需要的是 title 元素的文本节点内容.这就要求再增加一步,完整的表达式就是:

Java代码

  1. //book[author="TEST"]/title/text()  
  2.  text()该节点的内容  



5,编写代码 
现在提供一个简单的程序,它从 Java 语言中执行以上的表达式查询,然后把找到的所有图书的标题打印出来. 

5.1,将XML文档加载到DOM Document对象中
首先,需要将文档加载到一个 DOM Document 对象中. 

下面的简单代码片段解析文档并建立对应的 Document 对象:

Java代码

  1. //用 JAXP 解析文档  
  2. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  3. // never forget this!  
  4. factory.setNamespaceAware(true);  
  5. DocumentBuilder builder = factory.newDocumentBuilder();  
  6. Document doc = builder.parse("src/books.xml");  



到目前为止,这仅仅是标准的 JAXP 和 DOM. 

5.2,创建 XPathFactory

Java代码

  1. XPathFactory pathFactory = XPathFactory.newInstance();  


XPathFactory说明:

XPathFactory是一个抽象工厂. 

抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM. 

为了选择不同的模型,需要向XPathFactory.newInstance()方法传递标识对象模型的统一资源标识符(URI). 

比如 http://xom.nu/ 可以选择 XOM.但实际上,到目前为止 
DOM 是该 API 支持的惟一对象模型.

5.3,使用XPathFactory工厂创建 XPath 对象

Java代码

  1. XPath xpath = pathFactory.newXPath();  



5.4,使用XPath对象编译XPath表达式

Java代码

  1. XPathExpression pathExpression = xpath.compile("//book[author='TEST']/title/text()");  



5.5,计算 XPath 表达式得到结果
表达式是针对特定的上下文节点计算的,在这个例子中是整个文档.这时还必须指定返回类型.这里要求返回一个节点集:

Java代码

  1. Object result = pathExpression.evaluate(doc, XPathConstants.NODESET);  
  2. //doc是Document对象名,XPathConstants代表XPath常量,NODESET是XPath 1.0 NodeSet数据类型  
  3. //XPathConstants.NODESET将XPathConstants常量返回NODESET类型  



说明:
多数 XPath 表达式,特别是位置路径,都返回节点集. 

但是还有其他可能: 


比如,XPath 表达式:count(//book) 返回文档中的图书数量. 
XPath 表达式:count(//book[author="TEST"]) > 10 返回一个布尔值:如果文档中 TEST的著作超过 10 本则返回 true,否则返回 false. 



evaluate() 方法被声明为返回 Object,实际返回什么依赖于 XPath 表达式的结果以及要求的类型

一般来说,XPath与Java的映射关系是: 


number 映射为 java.lang.Double 
string 映射为 java.lang.String 
boolean 映射为 java.lang.Boolean 
node-set 映射为 org.w3c.dom.NodeList 


在 Java 中计算 XPath 表达式时,第二个参数(XPathConstants常量)指定需要的返回类型.有五种可能,都在 javax.xml.xpath.XPathConstants 类中命名了常量: 

XPathConstants.NODESET 
XPathConstants.BOOLEAN 
XPathConstants.NUMBER 
XPathConstants.STRING 
XPathConstants.NODE 

XPathConstants.NODE提示:

最后一个 XPathConstants.NODE 实际上没有匹配的 XPath 类型.只有知道 XPath 表达式只返回一个节点或者只需要一个节点时才使用它.如果 XPath 表达式返回了多个节点并且指定了 XPathConstants.NODE,则 evaluate() 按照文档顺序返回第一个节点.如果 XPath 表达式选择了一个空集并指定了 XPathConstants.NODE,则 evaluate() 返回 null. 



注意:如果不能完成要求的转换,evaluate()将抛出 XPathException. 

5.6,将结果强制转化成 DOM NodeList
通过将结果强制转化成 DOM NodeList,然后遍历列表就能得到所有的标题:

Java代码

  1. NodeList nodes = (NodeList) result;  
  2.         for (int i = 0; i < nodes.getLength(); i++) {  
  3.                 System.out.println(nodes.item(i).getNodeValue());  
  4.         }  



6,完整Java程序代码

Java代码

  1. package book;  
  2.   
  3. import javax.xml.parsers.DocumentBuilder;  
  4. import javax.xml.parsers.DocumentBuilderFactory;  
  5. import javax.xml.xpath.XPath;  
  6. import javax.xml.xpath.XPathConstants;  
  7. import javax.xml.xpath.XPathExpression;  
  8. import javax.xml.xpath.XPathFactory;  
  9.   
  10. import org.w3c.dom.Document;  
  11. import org.w3c.dom.NodeList;  
  12.   
  13. public class Test {  
  14.         public static void main(String[] args) throws Exception {  
  15.                 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  16.                 factory.setNamespaceAware(true); // never forget this!  
  17.                 DocumentBuilder builder = factory.newDocumentBuilder();  
  18.                 Document doc = builder.parse("src/books.xml");  
  19.   
  20.                 XPathFactory pathFactory = XPathFactory.newInstance();  
  21.   
  22.                 XPath xpath = pathFactory.newXPath();  
  23.   
  24.                 XPathExpression pathExpression = xpath  
  25.                                 .compile("//book[author='TEST']/title/text()");  
  26.   
  27.                 Object result = pathExpression.evaluate(doc, XPathConstants.NODESET);  
  28.   
  29.                 NodeList nodes = (NodeList) result;  
  30.                 for (int i = 0; i < nodes.getLength(); i++) {  
  31.                         System.out.println(nodes.item(i).getNodeValue());  
  32.                 }  
  33.         }  
分享到:
评论

相关推荐

    解析XML的四种JAR包jdom.jar、SAX.jar、dom4j.jar、dom.jar

    - **功能需求**:如果需要XPath查询,可以选择dom4j或JDK自带的DOM解析器。 - **社区支持和文档**:dom4j和JDOM都有丰富的文档和活跃的社区,遇到问题时更容易找到解决方案。 在实际开发中,应根据项目需求和性能...

    JDK1.6API中文版

    8. **XML处理**:`javax.xml`包包含了处理XML的类,如DOM、SAX和StAX解析器,以及XPath和XSLT处理器。 9. **Swing组件**:`javax.swing`包提供了用于构建图形用户界面的组件,如按钮、文本框、面板等。 10. **国际...

    超经典xml类

    例如,JDK自带的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`可用于构建和操作DOM树。 2. SAX解析: SAX解析器不将整个文档加载到内存,而是通过事件处理器接口(如`ContentHandler`)...

    jdk6.0中文文档

    5. **开发工具**:涵盖了JDK自带的开发工具,如javac编译器、jar打包工具、javadoc文档生成器等,以及如何使用这些工具进行开发。 6. **部署和安全**:讨论了Java应用的部署策略、网络应用的安全控制,以及如何使用...

    jdk-8u261-docs-all.zip

    4. **开发工具**:涵盖了JDK自带的开发工具,如javac编译器、javadoc文档生成工具、jdb调试器等,以及如何使用这些工具进行开发和调试。 通过学习这些文档,开发者可以掌握Java 8u261的最新特性和最佳实践,如...

    jdk-6u45-windows-x64.zip

    4. **调试与测试**:利用JDK自带的`jdb`调试器或IDE的内置调试工具进行程序调试。同时,可以使用JUnit进行单元测试。 **总结** JDK 6u45是Java开发的重要工具,为64位Windows用户提供了完整的开发和运行环境。其...

    jdk1.6+API,中文+工具书

    9. **JConsole增强**:JDK自带的性能监控工具JConsole增加了更多监控指标和性能分析功能。 10. **垃圾收集器优化**:包括CMS(Concurrent Mark Sweep)垃圾收集器的改进,减少了暂停时间。 **二、JDK 1.6 API中文...

    apk反编译原理(新).rar

    通过了解APK的签名机制、使用反编译工具以及解析XML和源码,我们可以更好地理解和优化Android应用,同时也提高了对潜在安全问题的识别能力。然而,务必注意,未经授权的反编译行为可能涉及侵犯版权,因此在实践中应...

    JDK_API_1_6_zh_CN.zip

    此版本包含了对先前版本的改进和新特性的添加,如增强的Swing组件、改进的内存管理、新的I/O流类库、以及对XML处理的加强等。 **API规范** API(Application Programming Interface)规范是Java的核心,它定义了...

    web开发常用jar

    Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep...

    MyEclipse8下struts2开发例程及解析1.doc

    ### MyEclipse 8 下 Struts 2 开发例程及解析 #### 一、环境配置与准备 本文档旨在详细介绍如何在 MyEclipse 8 环境中搭建并使用 Struts 2 框架进行开发。尽管市面上有很多关于 MyEclipse 和 Struts 的资源,但...

    Tomcat 5.0.18 ClassLoader source code insight

    1. **Bootstrap ClassLoader**:这是JVM自带的最基本的类加载器,负责加载JDK核心类库。 2. **System ClassLoader**:也称为Extension ClassLoader,负责加载JRE扩展目录下的类库。 3. **Common ClassLoader**:...

    java开发常用jar包

    Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 ...

    JAVA6.0帮助文档

    Java 6.0是Oracle公司推出的Java开发工具集(JDK)的一个重要版本,它包含了Java编程语言、Java虚拟机(JVM)、类库以及开发者工具。这份“JAVA6.0帮助文档”对于理解Java 6.0的核心特性和API至关重要,是开发者的...

    apache commons笔记1

    18. **Logging**:提供了一个可插拔的日志框架,允许开发者选择不同的日志实现,如 Log4j 或 JDK 自带的日志。 Apache Commons 的这些组件都是 Java 开发中的得力助手,它们各自专注于特定的领域,通过这些工具,...

    JSP学习实用参考手册

    - **CLASSPATH**: 添加JDK的类库路径,例如`.;C:\java\Lib;C:\tomcat\Lib`。 - **JAVA_HOME**: 同JDK_HOME,指向JDK的安装路径。 - **TOMCAT_HOME**: 指向Tomcat的安装路径,例如`C:\tomcat`。 - **Path**: 添加JDK...

    jsp开发本地详细配置

    `CLASSPATH`变量则用于指定类库的查找路径,包括JDK自带的`dt.jar`和`tools.jar`。此外,`Path`环境变量的设置确保了系统能够在任何目录下执行Java命令。 #### 编译与测试Java程序 文档中提供了一个简单的`hello`...

    精通JBuilder2005

    JBuilder2005自带了一系列标准类库,可以添加额外的库文件。 - **3.3.3 维护工程扩展类库** 在项目中可以添加外部类库,以便使用第三方库。 **3.4 设置JDK** - **3.4.1 配置一个新的JDK** 可以为项目指定...

    java 开发常用的jar包

    2. **开发工具**:JDK自带的开发工具如javac.exe、jar.exe等,其实也是通过对应的jar包实现的,例如tools.jar,它包含了编译、打包等工具的类。 3. **Servlet和JSP**:在Web开发中,servlet-api.jar和jsp-api.jar是...

Global site tag (gtag.js) - Google Analytics