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之DOM和SAX解析
- Java程序员从笨鸟到菜鸟之(二十六)XML之DOM和SAX解析
- Java程序员从笨鸟到菜鸟之(二十六)XML之DOM和SAX解析
- Java程序员从笨鸟到菜鸟之(二十六)XML之DOM和SAX解析
- JavaWeb-05 XML基础(Dom解析和Sax解析)
- Java用dom和sax解析xml代码(Jaxp)
- 【简记】Java Web 内幕——XML介绍,解析XML,DOM和SAX解析
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式的比较与详解(code稍作修改)
- 想编一个XML的解释器,以后要向Java移植,用SAX好还是DOM?
- java中用dom解析xml的经典入门级文档
- Java解析XML文档——dom解析xml (转载)
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式的比较与详解
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式的比较与详解
- java中用dom解析xml的经典入门级文档
- java中操作xml几种方式的比较和代码示例(DOM,SAX,JDOM,DOM4J)
- JAVA中用DOM修改xml,并保存
- Java之DOM读写XML不求人
- Java下XML编程接口比较:DOM SAX JDOM JAXP
- Java 解析xml的方法:DOM,SAX
- java DOM解析XML(1)