xml 해석 의 SAX 해석 과 PULL 해석
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name> </name>
<age>30</age>
<sex> </sex>
</person>
<person>
<name> </name>
<age>32</age>
<sex> </sex>
</person>
<person>
<name>wangwu</name>
<age>30</age>
<sex> </sex>
</person>
</persons>
1.SAX解析过程:创建一个MyHandler类继承DefaultHandler,重写startDocument、startElement、characters、endElement 、endDocument这些方法。/*DefaultHandler
SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。实际上只要继承DefaultHandler 类 ,再覆盖一部分 处理事件的方法 同样可以达到相同的效果。 实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现。)
以下是JDK API 1.6中的原文解释:
DefaultHandler是SAX2 事件处理程序的默认基类。
此模块(包括源代码和文档)位于公共域中,对该模块不提供担保。有关更多信息,请参阅 http://www.saxproject.org。此类可用作 SAX2 应用程序的有用基类:它提供四个核心 SAX2 处理程序类中的所有回调的默认实现:
EntityResolver
DTDHandler
ContentHandler
ErrorHandler
应用程序编写者可以在他们仅需实现部分接口时扩展此类;当应用程序尚未提供其自己的处理程序时解析器编写者可通过实例化此类来提供默认的处理程序。
此类替换不推荐使用的 SAX1
HandlerBase
类。*/
创建一个实体person类存储解析出来的数据。具体实现代码如下:person实体类:package com.qianfeng.saxparser1; public class Person { private String name; private int age; private String sex; public Person() { // TODO Auto-generated constructor stub } public Person(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } }
Myhandler 클래스package com.qianfeng.saxparser1; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler { private List<Person> list; private Person person; private String tagName; // @Override public void startDocument() throws SAXException { System.out.println(" ..."); list = new ArrayList<Person>(); } // @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // tagName = qName; System.out.println(" ...."+qName); if("person".equals(qName)) { person = new Person(); } } // @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch,start,length); System.out.println(" ...."+content); if("name".equals(tagName)) person.setName(content); else if("age".equals(tagName)) person.setAge(Integer.parseInt(content)); else if("sex".equals(tagName)) person.setSex(content); } // @Override public void endElement(String uri, String localName, String qName) throws SAXException { // tagName="";// , characters System.out.println(" ...."+qName); if("person".equals(qName)) { list.add(person); } } // @Override public void endDocument() throws SAXException { System.out.println(" ....."); } // public List<Person> getList() { return list; } }
테스트 주 방법:package com.qianfeng.saxparser1; import java.io.File; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class Test { /** * @param args * @throws SAXException * @throws ParserConfigurationException * @throws IOException */ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { // SAX SAXParserFactory factory = SAXParserFactory.newInstance(); // SAX SAXParser parser = factory.newSAXParser(); // File file = new File("user.xml"); // Handler MyHandler handler = new MyHandler(); // , handler parser.parse(file, handler); List<Person> list = handler.getList(); for(Person person:list) { System.out.println(person); } } }
2. pull 분석 과정
XmlPull 은 Sax 와 유사 합 니 다. 스 트림 (stream) 을 기반 으로 파일 을 조작 한 다음 노드 이벤트 에 따라 개발 자가 작성 한 처리 프로그램 입 니 다.스 트림 기반 처리 이기 때문에 Xmlpull 과 Sax 는 메모리 자원 을 비교적 절약 하고 Dom 처럼 모든 노드 를 떡갈나무 형식 으로 메모리 에 보 여 주지 않 습 니 다.그러나 Xmlpull 은 Sax 보다 더 간단명료 하 며 전체 흐름 을 스 캔 할 필요 가 없다.관심 있 는 사건 을 switch 로 처리 할 수 있 습 니 다.switch 문 구 를 while 순환 에 넣 습 니 다.parser. next () 가 존재 할 때 계속 반복 적 으로 실 행 됩 니 다.
주의: xml 의 이 말 은 빈 칸 을 두 지 말고 꼭 표시 해 야 한다. 그렇지 않 으 면 틀 리 면 디 버 깅 하기 어렵다.
Android 에서: Pull 은 Android 에 내 장 된 xml 해상도 입 니 다.Pull 해상도 기의 실행 방식 과 SAX 해상도 가 비슷 하 다.이것 은 유사 한 이 벤트 를 제공 합 니 다. 예 를 들 어 시작 요소 와 끝 요소 이 벤트 는 parser. next () 를 사용 하면 다음 요소 에 들 어가 서 해당 이 벤트 를 촉발 할 수 있 습 니 다.이 벤트 는 수치 코드 로 전송 되 므 로 관심 있 는 이 벤트 를 switch 로 처리 할 수 있 습 니 다.요소 가 분석 되 기 시 작 했 을 때 parser. nextText () 방법 을 사용 하면 다음 Text 형식 노드 의 값 을 얻 을 수 있 습 니 다.
프로 세 스: XmlPullParserFactory 공장 을 만 들 고 공장 을 통 해 XmlPullParser 해상도 기 를 가 져 와 분석 할 파일 을 만 들 고 parser. setInput () 방법 으로 해상도 기 를 기록 합 니 다 (인 코딩 문제 주의).코드 참조:package com.qianfeng.pullparser1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; public class PullParser { public List<Person> pullParser() throws XmlPullParserException, IOException { List<Person> list = null; Person person = null; // pull XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // pull XmlPullParser parser = factory.newPullParser(); //FileReader fr = new FileReader("user.xml"); FileInputStream fis = new FileInputStream("user.xml"); parser.setInput(fis, "utf-8"); // int event = parser.getEventType(); while(event!=XmlPullParser.END_DOCUMENT) { switch(event) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: // String tagName = parser.getName(); if("person".equals(tagName)) person = new Person(); else if("name".equals(tagName)) person.setName(parser.nextText()); else if("age".equals(tagName)) person.setAge(Integer.parseInt(parser.nextText()));// else if("sex".equals(tagName)) person.setSex(parser.nextText()); break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())) { list.add(person); person = null; } break; } // event = parser.next(); } return list; } /** * @param args * @throws IOException * @throws XmlPullParserException */ public static void main(String[] args) throws XmlPullParserException, IOException { // System.out.println(XmlPullParser.START_DOCUMENT); // System.out.println(XmlPullParser.START_TAG); // System.out.println(XmlPullParser.END_TAG); // System.out.println(XmlPullParser.END_DOCUMENT); PullParser pullParser = new PullParser(); List<Person> list = pullParser.pullParser(); for(Person person:list) { System.out.println(person); } } }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
XML이란 무엇입니까?이것은 저장, 검색 및 공유할 수 있는 형식으로 데이터를 저장하는 강력한 방법입니다. 가장 중요한 것은 XML의 기본 형식이 표준화되어 있기 때문에 시스템이나 플랫폼 간에 로컬 또는 인터넷을 통해 XML을 공유하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.