使用Java操作XML的开源框架比较多,如著名的Dom4J、JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用。本篇就来简单了解下原生的XML API。

JAVA的XML API

XML的开放性和Java的开源性注定它们是一种完美结合,因此Sun提供了一套专门用于处理XML的Java API:JAXP,JAXP遵循XML的两种解析标准:DOM(Document Object Model)和SAX(Simple API for XML Parsing),JAXP也支持XSLT(XML Stylesheet Language Transformation)标准,可控制数据的表现形式和XML文档与HTML等其他文档之间的数据转换。

  • DOM是对对文档结构及其内容的树形描述,该模型中的每个节点对应XML文档中的各种组成部分。使用DOM树,应用程序可以反复访问其中的某个节点、可以增加、删除、修改节点。DOM树中的节点分为两大类型:元素节点和文本节点。以DOM方式解析XML有以下优点:

    1. DOM将文本文件转化为抽象的树节点表示,能够避免文档在语法方面的错误,从而保证正确的语法和格式的正规性;
    2. DOM创建的节点树是对XML文档内容及其逻辑关系的正确反映,因而它是从XML语法规范中抽取内容而又高于语法约束的;同时,也使得对DOM树进行修改比修改XML文档本身要简单得多;
    3. DOM树不仅能够如实反映XML文档本身的层次结构,还可以很好地反映关系数据库中具有雪花结构的层次信息;
  • SAX不同于DOM,严格来说它并不是一种规范或标准。SAX解析是一种以时间驱动的流式解析,解析过程中按文档中的元素出现顺序逐个访问和处理元素。由于对XML文档组成部分的访问是一次性的,使用SAX时,解析器想应用程序报告解析事件流,来告知应用程序文档的内容。SAX解析方式具有以下特点:

    1. 对所解析的XML文件没有大小限制:由于SAX无须将整个XML文档载入内存,且处理时对内存占用并不随处理XML文档的大小而变化,因而对被处理文件的大小没要求;
    2. 简单易用;
    3. 处理速度快:由于以时间驱动的方式进行文档处理,无须对某个对象进行反复处理,因而速度很快;
    4. 不能对文档的组成部分进行随机存取:因为文档并没有载入内存,其处理是流式的,因而也难以实现对文档做复杂的查询;

    总体来说SAX解析占用的内存少,速度快,适用于对文档进行一次性处理情况。

JAXP的主要API都定义在javax.xml.parsers中,该包为开发SAX解析器和DOM解析器提供了公共接口:

  • 包org.w3c.dom负责以DOM方式解析;
  • 包org.xml.sax负责定义SAX API;
  • 包javax.xml.transform定义了将XML转换为其他形式的XSLT API;

解析示例

oseye.xml

  1. <?xml version="1.0"?>
  2. <note>
  3. <to>oseye.net</to>
  4. <from>kevin</from>
  5. <heading>Reminder</heading>
  6. <body>Don't forget the meeting!</body>
  7. </note>

Dom方式解析

  1. package com.byd.DomXML;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5.  
  6. import javax.xml.parsers.DocumentBuilder;
  7. import javax.xml.parsers.DocumentBuilderFactory;
  8. import javax.xml.parsers.ParserConfigurationException;
  9.  
  10. import org.w3c.dom.Document;
  11. import org.w3c.dom.Element;
  12. import org.w3c.dom.Node;
  13. import org.w3c.dom.NodeList;
  14. import org.xml.sax.SAXException;
  15.  
  16. /**
  17. * Dom方式解析XML
  18. */
  19. public class App {
  20. public static void main(String[] args) throws ParserConfigurationException,
  21. SAXException, IOException {
  22. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  23. DocumentBuilder bulder = factory.newDocumentBuilder();
  24. Document doc = bulder.parse(new File("d:/mytemp/xml/oseye.xml"));
  25. // 获取根元素
  26. Element element = doc.getDocumentElement();
  27. NodeList list = element.getChildNodes();
  28. for (int iloop = 0; iloop < list.getLength(); iloop++) {
  29. Node node = list.item(iloop);
  30. if (node.getNodeType() == Node.ELEMENT_NODE) {
  31. System.out.println(node.getNodeName() + ":"
  32. + node.getTextContent());
  33. }
  34. }
  35. }
  36. }

SAX方式解析

  1. package com.byd;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10.  
  11. import javax.xml.parsers.SAXParser;
  12. import javax.xml.parsers.SAXParserFactory;
  13.  
  14. import org.xml.sax.Attributes;
  15. import org.xml.sax.SAXException;
  16. import org.xml.sax.helpers.DefaultHandler;
  17.  
  18. /**
  19. * SAX方式解析
  20. */
  21. public class App
  22. {
  23. public static void main( String[] args ) throws Exception
  24. {
  25. SAXParserFactory factory=SAXParserFactory.newInstance();
  26. SAXParser sparse=factory.newSAXParser();
  27. SaxHandler handler=new SaxHandler("note");
  28. sparse.parse(new File("d:/mytemp/xml/oseye.xml"),handler);
  29. //输出
  30. for(Map<String,String> map:handler.getList()){
  31. Iterator<String> iterator=map.keySet().iterator();
  32. while(iterator.hasNext()){
  33. String key=iterator.next();
  34. System.out.println(key+":"+map.get(key));
  35. }
  36. }
  37. }
  38. }
  39.  
  40. class SaxHandler extends DefaultHandler {
  41. private HashMap<String, String> map = null;
  42. private List<HashMap<String, String>> list = null;
  43. //正在解析的元素的标签
  44. private String currentTag = null;
  45. //正在解析的元素的值
  46. private String currentValue = null;
  47. private String nodeName = null;
  48.  
  49. public List<HashMap<String, String>> getList(){
  50. return list;
  51. }
  52.  
  53. public SaxHandler(String nodeName) {
  54. this.nodeName = nodeName;
  55. }
  56.  
  57. @Override
  58. public void startDocument() throws SAXException {
  59. //当读到一个开始标签的时候,会触发这个方法
  60. list = new ArrayList<HashMap<String,String>>();
  61. }
  62.  
  63. @Override
  64. public void startElement(String uri, String localName, String name,
  65. Attributes attributes) throws SAXException {
  66. //当遇到文档的开头的时候,调用这个方法
  67. if(name.equals(nodeName)){
  68. map = new HashMap<String, String>();
  69. }
  70. if(attributes != null && map != null){
  71. for(int i = 0; i < attributes.getLength();i++){
  72. map.put(attributes.getQName(i), attributes.getValue(i));
  73. }
  74. }
  75. currentTag = name;
  76. }
  77.  
  78. @Override
  79. public void characters(char[] ch, int start, int length)
  80. throws SAXException {
  81. //这个方法用来处理在XML文件中读到的内容
  82. if(currentTag != null && map != null){
  83. currentValue = new String(ch, start, length);
  84. if(currentValue != null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){
  85. map.put(currentTag, currentValue);
  86. }
  87. }
  88. currentTag=null;
  89. currentValue=null;
  90. }
  91.  
  92. @Override
  93. public void endElement(String uri, String localName, String name)
  94. throws SAXException {
  95. //在遇到结束标签的时候,调用这个方法
  96. if(name.equals(nodeName)){
  97. list.add(map);
  98. map = null;
  99. }
  100. super.endElement(uri, localName, name);
  101. }
  102. }

输出

to:oseye.net
body:Don't forget the meeting!
from:kevin
heading:Reminder

以上并没有对API做详细讲解,具体API可参考JDK。

Java原生API操作XML的更多相关文章

  1. ZooKeeper 原生API操作

    zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...

  2. Java用DOM操作xml

    JAXP DOM方式解析XML文档实例增删改查package jiexi; import javax.xml.parsers.DocumentBuilder; import javax.xml.par ...

  3. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  4. 读《分布式一致性原理》JAVA客户端API操作3

    更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...

  5. 读《分布式一致性原理》JAVA客户端API操作2

    创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...

  6. ES的java端API操作

    首先简单介绍下写这篇博文的背景,最近负责的一个聚合型的新项目要大量使用ES的检索功能,之前对es的了解还只是纯理论最多加个基于postman的索引创建操作,所以这次我得了解在java端如何编码实现:网 ...

  7. Java原生API访问MongoDB

    1.pom.xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...

  8. java使用DOM操作XML

    XML DOM简介 XML DOM 是用于获取.更改.添加或删除 XML 元素的标准. XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个 ...

  9. Zookeeper(三)-- JAVA原生API

    一.前提 jar包:zookeeper-3.4.9.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.15.jar 二.Demo pa ...

随机推荐

  1. MySQL 安装 5.0

    MySQL免安装版配置 1.下载 MySQL 免安装版 2.将 MySQL 解压到待安装目录,使用%MYSQL_HOME%表示 3.打开文件my-huge.ini另存为my.ini,在my.ini文件 ...

  2. Java 读写Properties配置文件

    Java 读写Properties配置文件 JAVA操作properties文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了M ...

  3. Stanford机器学习课程之一——引言

    Andrew Ng的Machine Learning课程,在网易公开课上有中文版视频http://v.163.com/special/opencourse/machinelearning.html,六 ...

  4. HDU-1598-find the most comfortable road(暴力+并查集)多看看,

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1598 题目思路:对于这个题目,可以先按速度的大小成小到大排序, 再成0 到 m ,把所有可以联通的道路 ...

  5. 持续集成的一些讨论(CI)

    如何保证程序开发的新功能降低BUG,那就是需要他们自己写用测试工具来写测试用例,包括Mocha(JS).Junit(Java).GTest(C++):而上传到SVN或者GIT后,又如何保证能跟原有的功 ...

  6. 负载均衡软件LVS分析二(安装)

    一.  安装LVS软件 1.安装前准备工作操作系统:统一采用Centos4.4版本.地址规划,如表1所示:表1 更详细的信息如图2所示: 图2  LVS DR模式安装部署结构图 图2中的VIP指的是虚 ...

  7. redis使用Lua脚本

    最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言 ...

  8. PHP接入芝麻信用续。

    前面,做好了,PHP查询芝麻信用. 客户又要求说,芝麻官方,发来邮件,还需要提交网站的数据给芝麻, 就是说接入芝麻SDK,还有一步,就是数据反馈. 大概芝麻分就是根据这些反馈的数据来计算的吧. 不多说 ...

  9. html5中的meta标签

    1. <meta http-equiv="X-UA-Compatible" content="IE=edge" /> IE=edge告诉IE使用最新 ...

  10. weex官方demo weex-hackernews代码解读(1)

    一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...