XML:SAX解析

版权声明:赠人玫瑰,手有余香!本文是小哥哥的原创文章,转载或摘抄时请注明出处。 https://blog.csdn.net/lovecuidong/article/details/88577835

SAX解析

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。

  • 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
  • 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
  • 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

//使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();

//通过SAX解析工厂得到解析器对象		
SAXParser sp = spf.newSAXParser();

//通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();

//设置读取器的事件处理器		
xmlReader.setContentHandler(new BookParserHandler());

//解析xml文件	
xmlReader.parse("book.xml");

 SAX解析XML文档

<!-- XML文档 -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<中国>
	<北京 name="帝都">
		<东城>北大</东城>
		<西城>清华</西城>
	</北京>
	<上海>
		<浦东>复旦</浦东>
		<浦西>同济</浦西>
	</上海>
</中国>
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    // 1.创建解析工厂
    SAXParserFactory factory = SAXParserFactory.newInstance();
    // 2.得到解析器
    SAXParser sp = factory.newSAXParser();
    // 3.得到读取器
    XMLReader reader = sp.getXMLReader();
    // 4.设置内容处理器
    reader.setContentHandler(new TagvalueHandler());
    // 5.读取xml文档内容
    reader.parse("src/test/NewFile.xml");
}
//获取所有标签信息
class ListHandler implements ContentHandler {

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.println(new String(ch, start, length));
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.println("</" + qName + ">");
	}

	@Override
	public void endPrefixMapping(String prefix) throws SAXException {
		// TODO Auto-generated method stub

	}

	@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 setDocumentLocator(Locator locator) {
		// TODO Auto-generated method stub

	}

	@Override
	public void skippedEntity(String name) throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void startDocument() 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 startPrefixMapping(String prefix, String uri) throws SAXException {
		// TODO Auto-generated method stub

	}
}
// 获取指定标签的值
class TagvalueHandler extends DefaultHandler {

	private String currentTag;// 当前解析的标签名
	private int needNumber = 1;// 需要获取第几个标签
	private int currentNumber;// 当前解析第几个标签

	@Override
	public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
		currentTag = arg2;
		if ("东城".equals(currentTag))
			currentNumber++;
	}

	@Override
	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
		if ("东城".equals(currentTag) && needNumber == currentNumber)
			System.out.println(new String(arg0, arg1, arg2));
	}

	@Override
	public void endElement(String arg0, String arg1, String arg2) throws SAXException {
		currentTag = null;
	}
}
<!-- XML文档 -->
<?xml version="1.0" encoding="UTF-8"?>
<书架>
    <书>
        <书名>Java就业培训教程</书名>
        <作者>张孝祥</作者>
        <售价>39.00元</售价>
    </书>
    <书>
        <书名>JavaScript网页开发</书名>
        <作者>张孝祥</作者>
        <售价>28.00元</售价>
    </书>
</书架>
//根据对象取值
class BeanListHandler extends DefaultHandler {

	private List<Book> list = new ArrayList<Book>();
	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 characters(char[] ch, int start, int length) throws SAXException {
		if ("书名".equals(currentTag)) {
			String name = new String(ch, start, length);
			book.setName(name);
		}
		if ("售价".equals(currentTag)) {
			String price = new String(ch, start, length);
			book.setPrice(price);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (qName.equals("书")) {
			list.add(book);
			book = null;
		}
		currentTag = null;
	}

	public List<Book> getList() {
		return list;
	}
}

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/88577835