Java解析XML:Jdom解析和SAX解析
今天看了Java解析XML的几种方法,记录一下
1、Jdom解析
(1)读取XML内容
private static void readXML() {
// TODO Auto-generated method stub
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
Document document = JdomTools.getDocument("src/books.xml");
// 找节点
NodeList tagName = document.getElementsByTagName("name");
Node item = tagName.item(1);
// 获取节点文本
String textContent = item.getTextContent();
System.out.println(textContent);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(2)写入新节点
public static void write2XML() {
try {
//获取要写入新节点的原dom树信息
Document document = JdomTools.getDocument("src/books.xml");
NodeList nodeList = document.getElementsByTagName("book");
Node node = nodeList.item(0);
//实例化一个新的节点对象
Element element = document.createElement("nums");
element.setTextContent("132");
//追加到父节点中
node.appendChild(element);
//将修改后的新的dom覆盖掉原来的dom文件
JdomTools.write2Xml(document, "src/books.xml");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(3)移除子节点
public static void removeNode(){
try {
Document document = JdomTools.getDocument("src/books.xml");
///方法一
//Node node = document.getElementsByTagName("nums").item(0);
//System.out.println(node.getParentNode().getTextContent());
//node.getParentNode().removeChild(node);
///方法二
JdomTools.deleteNode(document.getElementsByTagName("book").item(0),document.getElementsByTagName("nums").item(0));
JdomTools.write2Xml(document, "src/books.xml");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(4)替换子节点
public static void replaceNode(){
try {
Document document = JdomTools.getDocument("src/books.xml");
Element element = document.createElement("添加的");
element.setTextContent("这是测试的内容");
JdomTools.replaceNodeText(element, document.getElementsByTagName("price").item(0));
JdomTools.write2Xml(document, "src/books.xml");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JdomTools工具类
package com.xujingyang.utils; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node; public class JdomTools { /**
* 查找document
* @param path
* @return
* @throws Exception
*/
public static Document getDocument(String path) throws Exception{
// 获取DocumentBuilder实例
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 获取document对象
return builder.parse(path);
} /**
* 删除节点
* @param path
* @param oldChild
* @param document
* @throws Exception
*/
public static void deleteNode(Node document,Node oldChild ) throws Exception{
//移除document节点下的子节点
document.removeChild(oldChild);
} /**
* 替换子节点
* @param document
* @param newChild
* @param oldChild
*/
public static void replaceNodeText(Node newChild,Node oldChild){
//oldChild替换替换为新的newChild节点
oldChild.getParentNode().replaceChild(newChild, oldChild);
}
/**
* 写入新节点
* @param document
* @param path
* @throws Exception
*/
public static void write2Xml(Document document,String path) throws Exception{
//获取Transformer对象
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//把写好的新的document树中写入新的文件(一般是覆盖原文件)
transformer.transform(new DOMSource(document), new StreamResult(path));
}
}
2、SAX解析
SAX
Simple API for XML
开发包
JAXP:是SUN公司推出的解析标准实现
java API for xml Processing
主要包含的类和接口
org.w3c.dom:提供DOM方式解析XML的标准接口
org.xml.sax:提供SAX方式解析XML的标准接口
javax.xml:提供了解析XML文档的类
(1)普通的解析方式
package com.xujingyang.utils; 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; public class saxDom {
public static void getDom(String XMLpath) throws Exception{
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = parserFactory.newSAXParser();
saxParser.parse(XMLpath, new DefaultHandler(){
protected String result="";
@Override
public void startDocument() throws SAXException {
//开始解析文档
super.startDocument();
result+="document begin\r\n";
} @Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
//开始解析节点
super.startElement(uri, localName, qName, attributes);
result+="\r\nelement begin";
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//开始读取节点内容
super.characters(ch, start, length);
result+=String.copyValueOf(ch, start, length);
} @Override
public void endDocument() throws SAXException {
//结束解析文档
super.endDocument();
result+="\r\ndocument end";
System.out.println(result);
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//结束解析节点
super.endElement(uri, localName, qName);
result+="\r\nelement end";
}
});
} }
(2)封装JavaBean的解析方式
package com.xujingyang.utils; import java.util.ArrayList; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; import com.xujingyang.domain.Book; public class sax4bean {
public static ArrayList<Book> getBooks() throws Exception{
//对象集合
final ArrayList<Book> books=new ArrayList<Book>();
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(new DefaultHandler(){
Book book=null;
String nodeString;//做判断是否节点是要找的属性节点 @Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//判断节点名称是要找的对象就初始化bean
if("book".equals(qName)){
book=new Book();
}
nodeString=qName; }
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if(book!=null){
String textString=new String(ch, start, length);
if("name".equals(nodeString)){
book.setName(textString);
}else if ("aothour".equals(nodeString)) {
book.setAothour(textString);
}else if ("price".equals(nodeString)) {
book.setPrice(Float.parseFloat(textString));
}
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//每次节点解析结束就要判断是否是一个对象结束,如果结束就将对象置空
if("book".equals(qName)){
books.add(book);
book=null;
}
//每次节点名称都要置空,否则就会读到空文本
nodeString=null;
}
});
reader.parse("src/books.xml"); return books;
}
}
对象类
package com.xujingyang.domain;
public class Book {
private String name;
private String aothour;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAothour() {
return aothour;
}
public void setAothour(String aothour) {
this.aothour = aothour;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", aothour=" + aothour + ", price="
+ price + "]";
}
}
要解析的XML文档
<?xml version="1.0" encoding="UTF-8" standalone="no"?><books>
<book>
<name>三国演义</name>
<aothour>罗贯中</aothour>
<price>22</price> </book>
<book>
<name>西游记</name>
<aothour>吴承恩</aothour>
<price>24</price>
</book>
</books>
Java解析XML:Jdom解析和SAX解析的更多相关文章
- Java高级特性 第14节 解析XML文档(2) - SAX 技术
一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...
- javaweb学习总结十二(JAXP对XML文档进行SAX解析)
一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 <?xml version="1.0" enco ...
- 2.2 使用 JAXP 对XML文档进行SAX解析
使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX
1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 特定信息. ...
- Android笔记(四十七) Android中的数据存储——XML(三)SAX解析
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...
- iOS开发中XML的DOM和SAX解析方法
一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...
- java解析xml字符串为实体(dom4j解析)
package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...
- 解析XML文件之使用SAM解析器
XML是一种常见的传输数据方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析. SAX解析器的长处是显而易见的.那就是SAX并不须要将全部的文 ...
随机推荐
- c的详细学习(4)选择结构与循环结构的编程练习
本节介绍c语言的编程实例. (1)求方程ax^2+bx+0的解: 方程有解有以下几种可能: 1.b^2-4ac=0,方程有两个相等实根. 2.b^2-4ac>0,方程有两个不等实 ...
- Dockerfile指令及docker的常用命令
DockerfileFROM: FROM <image> FROM <image>:<tag> MAINTAINER: MAINTAINER <name> ...
- Java多线程系列 JUC线程池04 线程池原理解析(三)
转载 http://www.cnblogs.com/skywang12345/p/3509954.html https://blog.csdn.net/qq_22929803/article/det ...
- leetcode 1049 Last Stone Weight II(最后一块石头的重量 II)
有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么 ...
- 【leetcode刷题笔记】3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- DEDE 列表页调用如 标题,时间,简介等
以下是直接从板子中复制出来的,CSS自已根据需要写下就行.在调时简介长度不知道怎么控制,现在说下方法1. infolen='30' 这个可以2. 系统设置 >其它设置 >内容简介长度填下就 ...
- adobe flash player 下载地址
1. https://www.adobe.com/cn/products/flashplayer/distribution3.html
- Buffer类的详解(转)
Buffer 类是 java.nio 的构造基础.一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索.缓冲区可以被写满或释放.对于 ...
- bootstrap中使用日历控件
在bootstrap中使用日历控件可以参照以下资料: http://www.bootcss.com/p/bootstrap-datetimepicker/index.htm 以下是参照此资料自己做的一 ...
- 十一 Django框架,Session
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 1.数据库(默认)2.缓存3.文件4.缓存+数据库5.加密cookie 1.数据库Session,保存在数据库 ...