SAX和DOM解析XML文档

1.DOM(Document Object Model)文档对象模型-----核心(core)、Html、Xml

      对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。

2.  要严格区分XML文档树中的根结点与根元素结点:

       根节点(Document)代表的是XML文档本身,是我们解析XML文档的入口,而根元素结点则表示XML文档的根元素,它对应于XML文档的Root

3. JAXP(Java API for XML Parsing):用于XML解析的Java API。

4.  对于XML解析器而言,空格不被忽略。

5. SAX(Simple APIs for XML)面向XML的简单API。

6. 使用DOM解析XML时,首先将XML文件加载到内存 中,然后通过随机的方式访问内存中的DOM树。

    SAX是基于事件,而且是顺序执行的,一旦经过了某个元素,我们就不能再访问它了。

    SAX不必事先将整个XML文档加载到内存中,因此它占据内存比DOM小,对于大型XML文档来说,通常会使用SAX而不是用DOM。

7.SAX也是使用的观察者模式

下面给出使用DOM和SAX解析XML的实例代码

a.使用SAX解析XML的实例

public class SaxParserStudent {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		SAXParserFactory apf = SAXParserFactory.newInstance();
		SAXParser saxParser = apf.newSAXParser();
		saxParser.parse(new File("doc/student.xml"),new MyHandler2());
	}
}
class MyHandler2 extends DefaultHandler{
	private String name;
	private String gender;
	private String age;
	Stack<String> stack = new Stack<String>();//SAX是基于事件,而且是顺序执行的,一旦经过了某个元素,我们就不能再访问它了,所以需要将解析的元素先放到stack中,当解析完毕后再从stack中取出。
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		stack.push(qName);
		for(int i = 0; i <attributes.getLength();i ++){
			String attribute = attributes.getQName(i);
			String attributeValue = attributes.getValue(i);
			System.out.println(attribute + ":" + attributeValue); 
		}
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String tag = stack.peek();
		if(("姓名").equals(tag)){
			name = new String(ch,start,length);
		}else if(("性别").equals(tag)){
			gender = new String(ch,start,length);
		}else if(("年龄").equals(tag)){
			age = new String(ch,start,length);
		}
	}
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		stack.pop();//表示该元素已经解析完毕,需要从栈中弹出
		if("姓名".equals(qName)){
			System.out.println("姓名:" + name);
		}else if("性别".equals(qName)){
			System.out.println("性别:" + gender);
		}else if("年龄".equals(qName)){
			System.out.println("年龄:" + age);
			System.out.println();
		}
		
	}
}

b.使用DOM解析XML实例

public class DomParserCandidate {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
				
		       		 // step 1:获得DOM解析器工厂(用于创建具体的DOM解析器)
		
				DocumentBuilderFactory dbf =  DocumentBuilderFactory.newInstance();
				
				//step 2:获得具体的DOM解析器
				DocumentBuilder db = dbf.newDocumentBuilder();
				
				//step 3:解析一个XML文档,获得Document对象。
				Document candidate = db.parse(new File("doc/candidate.xml"));
				
				
				NodeList persons = candidate.getElementsByTagName("PERSON");
				
				for(int i = 0; i < persons.getLength(); i++){
					Element nameElement = (Element) persons.item(i);
					String name = nameElement.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue();
					System.out.println("name:" + name );
					Element addressElement = (Element) persons.item(i);
					String address = addressElement.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue();
					System.out.println("address:" + address);
					
					Element telElement = (Element) persons.item(i);
					String tel = telElement.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue();
					System.out.println("tel:" + tel);
					
					Element faxElement = (Element) persons.item(i);
					String fax = faxElement.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue();
					System.out.println("fax:" + fax);
					
					Element emailElement = (Element) persons.item(i);
					String email = emailElement.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue();
					System.out.println("email:" + email);
				}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值