声明:类容为学习传智播客方立勋教学视频,总结。
一:SAX采用事件处理方式解析XML文档: 解析器 和 事件处理器(有多个处理器)
a:解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个文档了。
b:解析器只要解析到xml文档的一个组成部分,就会调用时间处理器的一个方法,同时把当前解析到的内容作为方法的参数传递给事件处理器。
得到解析器是模版代码:
// 获取sax解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 获取sax解析器 SAXParser sp = factory.newSAXParser(); // 获取sax读取器 XMLReader reader = sp.getXMLReader(); // 设置内容处理器 reader.setContentHandler(new TagValue()); // 读取xml内容 reader.parse("src/dom.xml");
我们的主要工作就是写事件处理器。
有两种方式:
a:实现ContentHandler接口
b:继承DefaultHandler类,覆盖我们需要的方法。
二:dom4j解析xml文档
二:dom4j解析xml文档
模版开始代码:
@Test public void read() throws DocumentException{ SAXReader reader = new SAXReader(); Document doc = reader.read(new File("src/Book.xml")); Element root = doc.getRootElement(); Element book = (Element) root.elements().get(1); String value = book.element("书名").getText(); System.out.println(value); }
写回文档的代码:
XMLWriter writer = new XMLWriter(new FileWriter("src/Book.xml")); writer.write(doc); writer.close();
dom4j有一个提取根标签的方法,很不错。
官方的说明文档很详细,基本一看就会了。就不在赘述了。
下面叙述一点XPath。w3cschool上面有这方面的讲解。但是讲解最好的个人认为是:
http://zvon.org/xxl/XPathTutorial/General_chi/examples.html
实例:
import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.BeforeClass; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; /** * sax解析xml文档 * * @author forlab * @version 2012-12-19 */ public class Sax { public static void main(String[] args) { try { ReadXml(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @BeforeClass public static void setUpBeforeClass() throws Exception { } public static void ReadXml() throws ParserConfigurationException, SAXException, IOException { // 获取sax解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 获取sax解析器 SAXParser sp = factory.newSAXParser(); // 获取sax读取器 XMLReader reader = sp.getXMLReader(); // 设置内容处理器 BeanListHandler handler = new BeanListHandler(); reader.setContentHandler(handler); // 读取xml内容 reader.parse("src/dom.xml"); List list = handler.getBooks(); } } class ListHander implements ContentHandler { @Override public void setDocumentLocator(Locator locator) { // TODO Auto-generated method stub } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // TODO Auto-generated method stub } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println("<"+qName+">"); //获取元素节点的属性值 for(int i=0;atts!=null && i<atts.getLength();i++){ String attName = atts.getQName(i); String attValue = atts.getValue(i); System.out.println(attName+"="+attValue); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub System.out.println(new String(ch, start, length)); } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target, String data) throws SAXException { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } } //继承类代码实现更容易 class TagValue extends DefaultHandler { private String currentName; private int needNum = 1; private int currentNum; @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // TODO Auto-generated method stub currentName = qName; if(currentName.equals("作者")){ currentNum++; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub currentName = null; } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub if ("作者".equals(currentName) && currentNum == needNum ) { System.out.println(new String(ch, start, length)); } } } class BeanListHandler extends DefaultHandler{ private List list = new ArrayList(); private String currentTag; private Book book; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentTag = qName; if("书".equals(currentTag)){ book = new Book(); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("书".equals(qName)){list.add(book); book = null; } currentTag = null; } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println("内容="+new String(ch,start,length)); if("书名".equals(currentTag)){ String value = new String(ch,start,length); book.setName(value); } if("作者".equals(currentTag)){ String value = new String(ch,start,length); book.setAuthor(value); } if("售价".equals(currentTag)){ String value = new String(ch,start,length); book.setPrice(value); } } public List getBooks(){ return list; } }
import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.junit.BeforeClass; import org.junit.Test; /** * @author forlab * @version 2012-12-19 */ public class Dom4j { @BeforeClass public static void setUpBeforeClass() throws Exception { } /** * 利用xpath技术,查找dom.xml中name属性值为forlab的元素 * @throws DocumentException */ @Test public void valid() throws DocumentException{ String username = "forlab"; SAXReader reader = new SAXReader(); Document document = reader.read(new File("src/dom.xml")); Node node = document.selectSingleNode("//作者[@name='"+username+"']"); if(node==null){ System.out.println("用户名或者密码错误!"); }else{ System.out.println("恭喜登陆成功!"); } } }相关资料:http://www.blogjava.net/junglesong/archive/2008/02/21/181196.html