Java原生API操作XML
使用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有以下优点:
- DOM将文本文件转化为抽象的树节点表示,能够避免文档在语法方面的错误,从而保证正确的语法和格式的正规性;
- DOM创建的节点树是对XML文档内容及其逻辑关系的正确反映,因而它是从XML语法规范中抽取内容而又高于语法约束的;同时,也使得对DOM树进行修改比修改XML文档本身要简单得多;
- DOM树不仅能够如实反映XML文档本身的层次结构,还可以很好地反映关系数据库中具有雪花结构的层次信息;
SAX不同于DOM,严格来说它并不是一种规范或标准。SAX解析是一种以时间驱动的流式解析,解析过程中按文档中的元素出现顺序逐个访问和处理元素。由于对XML文档组成部分的访问是一次性的,使用SAX时,解析器想应用程序报告解析事件流,来告知应用程序文档的内容。SAX解析方式具有以下特点:
- 对所解析的XML文件没有大小限制:由于SAX无须将整个XML文档载入内存,且处理时对内存占用并不随处理XML文档的大小而变化,因而对被处理文件的大小没要求;
- 简单易用;
- 处理速度快:由于以时间驱动的方式进行文档处理,无须对某个对象进行反复处理,因而速度很快;
- 不能对文档的组成部分进行随机存取:因为文档并没有载入内存,其处理是流式的,因而也难以实现对文档做复杂的查询;
总体来说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
- <?xml version="1.0"?>
- <note>
- <to>oseye.net</to>
- <from>kevin</from>
- <heading>Reminder</heading>
- <body>Don't forget the meeting!</body>
- </note>
Dom方式解析
- package com.byd.DomXML;
- import java.io.File;
- import java.io.IOException;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import org.xml.sax.SAXException;
- /**
- * Dom方式解析XML
- */
- public class App {
- public static void main(String[] args) throws ParserConfigurationException,
- SAXException, IOException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder bulder = factory.newDocumentBuilder();
- Document doc = bulder.parse(new File("d:/mytemp/xml/oseye.xml"));
- // 获取根元素
- Element element = doc.getDocumentElement();
- NodeList list = element.getChildNodes();
- for (int iloop = 0; iloop < list.getLength(); iloop++) {
- Node node = list.item(iloop);
- if (node.getNodeType() == Node.ELEMENT_NODE) {
- System.out.println(node.getNodeName() + ":"
- + node.getTextContent());
- }
- }
- }
- }
SAX方式解析
- package com.byd;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- /**
- * SAX方式解析
- */
- public class App
- {
- public static void main( String[] args ) throws Exception
- {
- SAXParserFactory factory=SAXParserFactory.newInstance();
- SAXParser sparse=factory.newSAXParser();
- SaxHandler handler=new SaxHandler("note");
- sparse.parse(new File("d:/mytemp/xml/oseye.xml"),handler);
- //输出
- for(Map<String,String> map:handler.getList()){
- Iterator<String> iterator=map.keySet().iterator();
- while(iterator.hasNext()){
- String key=iterator.next();
- System.out.println(key+":"+map.get(key));
- }
- }
- }
- }
- class SaxHandler extends DefaultHandler {
- private HashMap<String, String> map = null;
- private List<HashMap<String, String>> list = null;
- //正在解析的元素的标签
- private String currentTag = null;
- //正在解析的元素的值
- private String currentValue = null;
- private String nodeName = null;
- public List<HashMap<String, String>> getList(){
- return list;
- }
- public SaxHandler(String nodeName) {
- this.nodeName = nodeName;
- }
- @Override
- public void startDocument() throws SAXException {
- //当读到一个开始标签的时候,会触发这个方法
- list = new ArrayList<HashMap<String,String>>();
- }
- @Override
- public void startElement(String uri, String localName, String name,
- Attributes attributes) throws SAXException {
- //当遇到文档的开头的时候,调用这个方法
- if(name.equals(nodeName)){
- map = new HashMap<String, String>();
- }
- if(attributes != null && map != null){
- for(int i = 0; i < attributes.getLength();i++){
- map.put(attributes.getQName(i), attributes.getValue(i));
- }
- }
- currentTag = name;
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- //这个方法用来处理在XML文件中读到的内容
- if(currentTag != null && map != null){
- currentValue = new String(ch, start, length);
- if(currentValue != null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){
- map.put(currentTag, currentValue);
- }
- }
- currentTag=null;
- currentValue=null;
- }
- @Override
- public void endElement(String uri, String localName, String name)
- throws SAXException {
- //在遇到结束标签的时候,调用这个方法
- if(name.equals(nodeName)){
- list.add(map);
- map = null;
- }
- super.endElement(uri, localName, name);
- }
- }
输出
to:oseye.net
body:Don't forget the meeting!
from:kevin
heading:Reminder
以上并没有对API做详细讲解,具体API可参考JDK。
Java原生API操作XML的更多相关文章
- ZooKeeper 原生API操作
zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...
- Java用DOM操作xml
JAXP DOM方式解析XML文档实例增删改查package jiexi; import javax.xml.parsers.DocumentBuilder; import javax.xml.par ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- 读《分布式一致性原理》JAVA客户端API操作3
更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...
- 读《分布式一致性原理》JAVA客户端API操作2
创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...
- ES的java端API操作
首先简单介绍下写这篇博文的背景,最近负责的一个聚合型的新项目要大量使用ES的检索功能,之前对es的了解还只是纯理论最多加个基于postman的索引创建操作,所以这次我得了解在java端如何编码实现:网 ...
- Java原生API访问MongoDB
1.pom.xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...
- java使用DOM操作XML
XML DOM简介 XML DOM 是用于获取.更改.添加或删除 XML 元素的标准. XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个 ...
- 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 ...
随机推荐
- MySQL 安装 5.0
MySQL免安装版配置 1.下载 MySQL 免安装版 2.将 MySQL 解压到待安装目录,使用%MYSQL_HOME%表示 3.打开文件my-huge.ini另存为my.ini,在my.ini文件 ...
- Java 读写Properties配置文件
Java 读写Properties配置文件 JAVA操作properties文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了M ...
- Stanford机器学习课程之一——引言
Andrew Ng的Machine Learning课程,在网易公开课上有中文版视频http://v.163.com/special/opencourse/machinelearning.html,六 ...
- HDU-1598-find the most comfortable road(暴力+并查集)多看看,
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1598 题目思路:对于这个题目,可以先按速度的大小成小到大排序, 再成0 到 m ,把所有可以联通的道路 ...
- 持续集成的一些讨论(CI)
如何保证程序开发的新功能降低BUG,那就是需要他们自己写用测试工具来写测试用例,包括Mocha(JS).Junit(Java).GTest(C++):而上传到SVN或者GIT后,又如何保证能跟原有的功 ...
- 负载均衡软件LVS分析二(安装)
一. 安装LVS软件 1.安装前准备工作操作系统:统一采用Centos4.4版本.地址规划,如表1所示:表1 更详细的信息如图2所示: 图2 LVS DR模式安装部署结构图 图2中的VIP指的是虚 ...
- redis使用Lua脚本
最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言 ...
- PHP接入芝麻信用续。
前面,做好了,PHP查询芝麻信用. 客户又要求说,芝麻官方,发来邮件,还需要提交网站的数据给芝麻, 就是说接入芝麻SDK,还有一步,就是数据反馈. 大概芝麻分就是根据这些反馈的数据来计算的吧. 不多说 ...
- html5中的meta标签
1. <meta http-equiv="X-UA-Compatible" content="IE=edge" /> IE=edge告诉IE使用最新 ...
- weex官方demo weex-hackernews代码解读(1)
一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...