java解析xml之一:使用SAX与DOM
2008-05-19 20:06
976 查看
来自:http://sysu-zeh.javaeye.com/blog/119229
一.概要
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
二.实例
1.所需xml文件
Test.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book email="zeh2007@126.com">
<name>C++编程思想</name>
<price>60.0</price>
</book>
</books>
students.xml
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students>
<student sn="04378066">
<name>ldz</name>
<age>23</age>
</student>
<student sn="04378069">
<name>zeh</name>
<age>21</age>
</student>
</students>
2.将xml文件转化为dom:
package domParser;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
//下面主要是org.xml.sax包的类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class DOMConvert {
public static void main(String[] args) {
//DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档的输入流,得到一个Document
Document doc=db.parse(new File("xmlFil/students.xml"));
//建立一个XML节点
Element eltStu=doc.createElement("student");
Element eltName=doc.createElement("name");
Element eltAge=doc.createElement("age");
Text textName=doc.createTextNode("yyr");
Text textAge=doc.createTextNode("22");
eltName.appendChild(textName);
eltAge.appendChild(textAge);
eltStu.appendChild(eltName);
eltStu.appendChild(eltAge);
eltStu.setAttribute("sn","04378072");
//将此节点插入根的孩子中
Element root=doc.getDocumentElement();
root.appendChild(eltStu);
//获取stuent标签节点
NodeList nl=root.getElementsByTagName("student");
//删除第一个节点
root.removeChild(nl.item(0));
//获取第一个节点
Element eltStuChg=(Element)nl.item(0);
//获取age标签节点
Node nodeAgeChg=eltStuChg.getElementsByTagName("age").item(0);
nodeAgeChg.getFirstChild().setNodeValue("20");
int len=nl.getLength();
for(int i=0;i
Element elt=(Element)nl.item(i);
System.out.println("编号:" + elt.getAttribute("sn"));
Node nodeName=elt.getElementsByTagName("name").item(0);
Node nodeAge=elt.getElementsByTagName("age").item(0);
String name=nodeName.getFirstChild().getNodeValue();
String age=nodeAge.getFirstChild().getNodeValue();
System.out.println("姓名:"+name);
System.out.println("年龄:" + age);
System.out.println("--------------------");
}
//实例化一个转换工厂
TransformerFactory tff=TransformerFactory.newInstance();
//获取一个转换实例
Transformer tf=tff.newTransformer();
//设置输出属性
tf.setOutputProperty("encoding","gb2312");
//根据Document对象新建一个DOM数据源
DOMSource source=new DOMSource(doc);
//定义输出流
StreamResult result=new StreamResult(new File("convert.xml"));
//从数据源转换至输出流
tf.transform(source,result);
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
catch (SAXException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (TransformerConfigurationException e) {
e.printStackTrace();
}
catch (TransformerException e) {
e.printStackTrace();
}
}
}
[b]3.解析DOM树
package domParser;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
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;
public class DomParser {
public DomParser() {
//DOM解析器的工厂实例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
//把要解析的XML文档转化为输入流
InputStream is=new FileInputStream("Test.xml");
//解析XML文档的输入流,得到一个Document
Document doc=dombuilder.parse(is);
//得到XML文档的根节点
Element root=doc.getDocumentElement();
//得到节点的子节点
NodeList books=root.getChildNodes();
if(books!=null) {
for(int i=0;i
Node book=books.item(i);
if(book.getNodeType()==Node.ELEMENT_NODE) {
//取得节点的属性值
String email=book.getAttributes().getNamedItem("email").getNodeValue();
System.out.println(email);
//轮循子节点
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()) {
if(node.getNodeType()==Node.ELEMENT_NODE) {
if(node.getNodeName().equals("name")) {
String name=node.getNodeValue();
node.setNodeValue("Java编程思想");
String name1=node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(name1);
}
if(node.getNodeName().equals("price")) {
String price=node.getFirstChild().getNodeValue();
System.out.println(price);
}
}
}
}
}
}
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (SAXException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
new DomParser();
}
}
4.打印DOM树
package domParser;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class DOMPrinter{
//打印指定节点(节点名:节点值)
public static void printNodeInfo(Node node){
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
//递归打印全部节点
public static void printNode(Node node){
short nodeType=node.getNodeType();
//判断节点类型
switch(nodeType){
//前缀节点
case Node.PROCESSING_INSTRUCTION_NODE:
System.out.println("-----------PI start-----------");
printNodeInfo(node);
System.out.println("-----------PI end-----------");
break;
//元素节点
case Node.ELEMENT_NODE:
System.out.println("-----------Element start-----------");
printNodeInfo(node);
System.out.println("-----------Element end-----------");
//打印节点属性值
NamedNodeMap attrs=node.getAttributes();
int attrNum=attrs.getLength();
for(int i=0;i
Node attr=attrs.item(i);
System.out.println("-----------Attribute start-----------");
printNodeInfo(attr);
System.out.println("-----------Attribute end-----------");
}
break;
//文本节点
case Node.TEXT_NODE:
System.out.println("-----------Text start-----------");
printNodeInfo(node);
System.out.println("-----------Text end-----------");
break;
default:
break;
}
//递归打印节点信息
Node child=node.getFirstChild();
while(child!=null){
printNode(child);
child=child.getNextSibling();
}
}
public static void main(String[] args){
//DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try{
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档的输入流,得到一个Document
Document doc=db.parse(new File("students.xml"));
//打印节点
printNode(doc);
}
catch (ParserConfigurationException e){
e.printStackTrace();
}
catch (SAXException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
}
[/b]
一.概要
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
二.实例
1.所需xml文件
Test.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book email="zeh2007@126.com">
<name>C++编程思想</name>
<price>60.0</price>
</book>
</books>
students.xml
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students>
<student sn="04378066">
<name>ldz</name>
<age>23</age>
</student>
<student sn="04378069">
<name>zeh</name>
<age>21</age>
</student>
</students>
2.将xml文件转化为dom:
package domParser;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
//下面主要是org.xml.sax包的类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class DOMConvert {
public static void main(String[] args) {
//DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档的输入流,得到一个Document
Document doc=db.parse(new File("xmlFil/students.xml"));
//建立一个XML节点
Element eltStu=doc.createElement("student");
Element eltName=doc.createElement("name");
Element eltAge=doc.createElement("age");
Text textName=doc.createTextNode("yyr");
Text textAge=doc.createTextNode("22");
eltName.appendChild(textName);
eltAge.appendChild(textAge);
eltStu.appendChild(eltName);
eltStu.appendChild(eltAge);
eltStu.setAttribute("sn","04378072");
//将此节点插入根的孩子中
Element root=doc.getDocumentElement();
root.appendChild(eltStu);
//获取stuent标签节点
NodeList nl=root.getElementsByTagName("student");
//删除第一个节点
root.removeChild(nl.item(0));
//获取第一个节点
Element eltStuChg=(Element)nl.item(0);
//获取age标签节点
Node nodeAgeChg=eltStuChg.getElementsByTagName("age").item(0);
nodeAgeChg.getFirstChild().setNodeValue("20");
int len=nl.getLength();
for(int i=0;i
Element elt=(Element)nl.item(i);
System.out.println("编号:" + elt.getAttribute("sn"));
Node nodeName=elt.getElementsByTagName("name").item(0);
Node nodeAge=elt.getElementsByTagName("age").item(0);
String name=nodeName.getFirstChild().getNodeValue();
String age=nodeAge.getFirstChild().getNodeValue();
System.out.println("姓名:"+name);
System.out.println("年龄:" + age);
System.out.println("--------------------");
}
//实例化一个转换工厂
TransformerFactory tff=TransformerFactory.newInstance();
//获取一个转换实例
Transformer tf=tff.newTransformer();
//设置输出属性
tf.setOutputProperty("encoding","gb2312");
//根据Document对象新建一个DOM数据源
DOMSource source=new DOMSource(doc);
//定义输出流
StreamResult result=new StreamResult(new File("convert.xml"));
//从数据源转换至输出流
tf.transform(source,result);
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
catch (SAXException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (TransformerConfigurationException e) {
e.printStackTrace();
}
catch (TransformerException e) {
e.printStackTrace();
}
}
}
[b]3.解析DOM树
package domParser;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
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;
public class DomParser {
public DomParser() {
//DOM解析器的工厂实例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
//把要解析的XML文档转化为输入流
InputStream is=new FileInputStream("Test.xml");
//解析XML文档的输入流,得到一个Document
Document doc=dombuilder.parse(is);
//得到XML文档的根节点
Element root=doc.getDocumentElement();
//得到节点的子节点
NodeList books=root.getChildNodes();
if(books!=null) {
for(int i=0;i
Node book=books.item(i);
if(book.getNodeType()==Node.ELEMENT_NODE) {
//取得节点的属性值
String email=book.getAttributes().getNamedItem("email").getNodeValue();
System.out.println(email);
//轮循子节点
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()) {
if(node.getNodeType()==Node.ELEMENT_NODE) {
if(node.getNodeName().equals("name")) {
String name=node.getNodeValue();
node.setNodeValue("Java编程思想");
String name1=node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(name1);
}
if(node.getNodeName().equals("price")) {
String price=node.getFirstChild().getNodeValue();
System.out.println(price);
}
}
}
}
}
}
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (SAXException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
new DomParser();
}
}
4.打印DOM树
package domParser;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class DOMPrinter{
//打印指定节点(节点名:节点值)
public static void printNodeInfo(Node node){
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
//递归打印全部节点
public static void printNode(Node node){
short nodeType=node.getNodeType();
//判断节点类型
switch(nodeType){
//前缀节点
case Node.PROCESSING_INSTRUCTION_NODE:
System.out.println("-----------PI start-----------");
printNodeInfo(node);
System.out.println("-----------PI end-----------");
break;
//元素节点
case Node.ELEMENT_NODE:
System.out.println("-----------Element start-----------");
printNodeInfo(node);
System.out.println("-----------Element end-----------");
//打印节点属性值
NamedNodeMap attrs=node.getAttributes();
int attrNum=attrs.getLength();
for(int i=0;i
Node attr=attrs.item(i);
System.out.println("-----------Attribute start-----------");
printNodeInfo(attr);
System.out.println("-----------Attribute end-----------");
}
break;
//文本节点
case Node.TEXT_NODE:
System.out.println("-----------Text start-----------");
printNodeInfo(node);
System.out.println("-----------Text end-----------");
break;
default:
break;
}
//递归打印节点信息
Node child=node.getFirstChild();
while(child!=null){
printNode(child);
child=child.getNextSibling();
}
}
public static void main(String[] args){
//DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try{
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档的输入流,得到一个Document
Document doc=db.parse(new File("students.xml"));
//打印节点
printNode(doc);
}
catch (ParserConfigurationException e){
e.printStackTrace();
}
catch (SAXException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
}
[/b]
相关文章推荐
- java解析xml之一:使用SAX与DOM
- Java中使用Dom和Sax两种思想解析XML
- Java乔晓松-使用SAX,DOM,pull解析XML文件以及pull解析生成xml文件
- 006_03Java解析XML之DOM方式与SAX方式
- java之XML解析(Dom及Sax)
- Java 解析 xml 之 DOM and SAX
- 使用Java自带SAX工具解析XML
- 使用DOM解析XML文档示例(Java)
- 使用Java自带SAX工具解析XML
- java中XML文档解析3 (sax和stax的使用)
- Java&Xml教程(五)使用SAX方式解析XML文件
- Java解析XML(一) 使用DOM读取XML文件
- javaXML解析的俩种方法-----DOM-----SAX
- javaWeb-xml解析概述和DOM&SAX解析原理
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较
- 安卓使用DOM,SAX,PULL解析xml,安卓写入xml文件
- android中使用SAX, DOM, 或者pull 来解析XML文档
- java学习笔记——使用DOM解析XML和使用SAX解析XML
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- JAva使用DOM读取XML数据(解析)