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并不须要将全部的文 ...
随机推荐
- js实现select动态添加option
关于 select 的添加 option 应该注意的问题. 标准的做法如上也就是说,标准的做法是 s.options.add();但是如果你一定要用 s.appendChild(option);注意了 ...
- 【leetcode刷题笔记】Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- render总结
vue渲染组件的顺序是: 执行render函数-->没有render参数解析template参数内容-->没有template参数将el内html当做template解析 其中解析temp ...
- 【DP】最长不下降子序列问题(二分)
Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]= ...
- 20145229吴姗珊《Java程序设计》2天总结
20145229吴姗珊<Java程序设计>2天总结 教材学习内容总结 异常处理 1.使用try.catch Java中所有错误都会被包装成对象,可以尝试(try)执行程序并捕捉(catch ...
- Memory Layout of C Programs
Memory Layout of C Programs A typical memory representation of C program consists of following sec ...
- LUA学习之一 初次接触
对于一个开源工程,开始学习它的第一步自然是编译工程. 使用vc编译lua,在网上已有许多介绍,但“纸上得来终觉浅”,自己走一遍还是有必要的. 步骤如下: 1.下载源代码,从lua.org下载最新源代码 ...
- Codeforces 163A Substring and Subsequence:dp【子串与子序列匹配】
题目链接:http://codeforces.com/problemset/problem/163/A 题意: 给你两个字符串a,b,问你有多少对"(a的子串,b的子序列)"可以匹 ...
- php: +1天, +3个月, strtotime(): +1 day, +3 month
php: +1天, +3个月, strtotime(): +1 day, +3 month 比如,我现在当前时间基础上+1天: strtotime("+1 day"); 比如我现 ...
- Python — pandas
Pandas有两种数据结构:Series和DataFrame. 1.Series Series类似于一维数组,和numpy的array接近,由一组数据和数据标签组成.数据标签有索引的作用.数据标签是p ...