您的位置:首页 > 编程语言 > Java开发

JAVA中xml的DOM和SAX解析

2017-05-06 15:37 309 查看
注:这个例子来自imooc。
***********************************DOM解析*****************************************************
import java.io.IOException;
import javax.lang.model.util.AbstractTypeVisitor6;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomRead {

public static void main(String[] args) {
// 创建DoucumentBuilderFactory的对象。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 创建一个DocumentBuilder的对象。
DocumentBuilder db = dbf.newDocumentBuilder();
// 相对路径;
//通过documentBulider对象的parse方法加载xml文件。
Document document = db.parse("books.xml");
//获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book");
//遍历每一个book节点.
for( int i=0;i<bookList.getLength();i++ )
{
//*****************不知道属性名*********************
//使用item方法获取每一个book节点。
Node book = bookList.item(i);
//获取book节点的所有属性
NamedNodeMap nnm = book.getAttributes();
//遍历book的属性
for( int j=0;j<nnm.getLength();j++ )
{
Node attr = nnm.item(j);
System.out.println("属性:"+attr.getNodeName()+" 值:"+attr.getNodeValue());

}
//******************知道属性的名称。********************
// Element book = (Element)bookList.item(i);
// String attr = book.getAttribute("id");
// System.out.println("属性:id"+"值: "+attr);

//获取book的子节点。
NodeList childNodes = book.getChildNodes();
for( int j=0;j<childNodes.getLength();j++ )
{
Node child = childNodes.item(j);
//区分出text类型的node以及element类型的node
if( child.getNodeType()==Node.TEXT_NODE )
continue;
//获取node节点的值。
System.out.println(child.getNodeName()+" : "+child.getTextContent());
}
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}

}*********************************************SAX解析*****************************************************

SAX相对DOM而言具有占用内存小的优势。并且SAX可以在不清楚XML结构的时候对XML进行遍历。

SAX共分为5个阶段,对应了5个方法:startDocument,endDocument,startElement,endElement,characters,分别为开始遍历文件,结束遍历文件,开始遍历标签,结束遍历标签以及遍历标签内容。

实现时需要继承Handler类并重写上面5个方法。

Main方法代码

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SaxRead {

public static int cnt = 1;
public static void main(String[] args) {
//获取SAXParserFactory实例。
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
//通过factory获取SaxParser实例。
SAXParser parser = spf.newSAXParser();
//需要一个handler对象。
SaxParserHandler handler = new SaxParserHandler();
parser.parse("books.xml", handler);
}catch (IOException e) {
e.printStackTrace();
}
catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}

}SaxParserHandler类的代码:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxParserHandler extends DefaultHandler {
//遍历开始标签。
@Override
public void startElement(String uri, String localName, S
4000
tring qName, Attributes attributes) throws SAXException {

super.startElement(uri, localName, qName, attributes);
//qname为标签名称。
if( qName.equals("book") )
{
System.out.println("This is " +(SaxRead.cnt)+ " book!");
//知道属性名称。
//System.out.println("book的属性为: "+attributes.getValue("id"));
//不知道属性名称和个数。
for( int i=0;i<attributes.getLength();i++ )
{
System.out.println("属性名:"+attributes.getQName(i)+" 属性值:"+attributes.getValue(i));
}
}
else if( !qName.equals("bookstore") ){
System.out.print("节点名是:"+qName);
}
}
//遍历标签中的text内容。
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String text = new String(ch,start,length);
//trim为去掉字符串中的空格。
if( !text.trim().equals("") )
{
System.out.println(" 节点值是: "+text);
}
}

//遍历结束标签。
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

super.endElement(uri, localName, qName);
if( qName.equals("book") )
{
System.out.println("**********The " +(SaxRead.cnt++)+ " book is over!*************");
}
}
//用来标志解析开始。
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析开始");
}
//用来标志解析结束。
@Override
public void endDocument() throws SAXException {

super.endDocument();
System.out.println("SAX解析结束");
}
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA XML