
正文
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>






