SAX和DOM解析XML文档

来源:互联网 发布:linux lcd 设备文件 编辑:程序博客网 时间:2024/04/29 23:56

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中取出。@Overridepublic 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); }}@Overridepublic 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);}}@Overridepublic 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);}}}


0 0