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并不须要将全部的文 ...
随机推荐
- mathjax
MathJax.Hub.Typeset() method. This will cause the preprocessors (if any were loaded) to run over the ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...
- 什么是gitlab CI ?CI代表什么?
CI是Continuous Integration的简称,就是持续集成的意思. 就是说你代码改动了,测试了,提交了,持续集成系统会自动构建(编译等等).持续集成的理念是每个提交的版本都应该是可交付的, ...
- HDU 1255 覆盖的面积 (线段树扫描线+面积交)
自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了 题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...
- java.sql.SQLException: Column count doesn't match value count at row 1 Query: insert into category values(null,?,?,?) Parameters: [1111111, 1111, 软件]
java.sql.SQLException 问题: java.sql.SQLException: Column count doesn't match value count at row 1 Que ...
- jQuery JS 入门记录
1.类型转换 .toString() 转字符串 . parseInt() parseFloat() 强制转换 数字型(Number) 1.声明 var i = 1; var i = new Numbe ...
- idea中java异常
1. Compilation failed: internal java compiler error 解决方案:File-->Setting...-->Build,Execution,D ...
- POJ 2309 BST(二叉搜索树)
思路:除以2^k,找到商为奇数的位置,k为层数,有2^(k+1)-1个节点 这里直接用位运算,x & -x 就求出 2^k 了. #include<iostream> using ...
- linux-常用指令3
系统管理命令 stat 显示指定文件的详细信息,比ls更详细 who 显示在线登陆用户 whoami 显示当前操作用户 host ...
- swiper轮播 swiper整屏轮播
近期坐了几个移动端 整屏轮播的 效果 之前都是自己一个个写,之前听说过swiper插件,没有使用过,今天一尝试,果然,爽 使用方法示例 <div class="swiper-cont ...