Android XML 데이터 파싱
이 섹션 소개:
이전 두 섹션에서는 Android에 내장된 Http 요청 메서드인 HttpURLConnection과 HttpClient를 살펴보았습니다. 원래는 OkHttp라고 생각했습니다. 통합이 되었고, Okhttp의 기본적인 사용법을 설명하고 싶었지만, 나중에 써드파티를 소개해야 한다는 것을 알게 되었기 때문에 잊어버리고 고급 부분에 넣습니다. 자, 이번 섹션에서는 Android에서 제공하는 XML 데이터 구문 분석을 위한 세 가지 솔루션에 대해 알아 보겠습니다! 그들은: 파싱 방법에는 SAX, DOM, PULL 세 가지가 있습니다. 아래에서 이에 대해 알아보겠습니다.
1. XML 데이터의 핵심 소개
먼저 XML 데이터의 몇 가지 요구 사항과 개념을 살펴보겠습니다.
2. 세 가지 XML 구문 분석 방법 비교
3. SAX 구문 분석 XML 데이터
핵심 코드:
SAX 구문 분석 클래스:SaxHelper.java:
/** * Created by Jay on 2015/9/8 0008. */ public class SaxHelper extends DefaultHandler { private Person person; private ArrayList persons; //当前解析的元素标签 private String tagName = null; /** * 当读取到文档开始标志是触发,通常在这里完成一些初始化操作 */ @Override public void startDocument() throws SAXException { this.persons = new ArrayList(); Log.i("SAX", "读取到文档头,开始解析xml"); } /** * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equals("person")) { person = new Person(); person.setId(Integer.parseInt(attributes.getValue("id"))); Log.i("SAX", "开始处理person元素~"); } this.tagName = localName; } /** * 读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //判断当前标签是否有效 if (this.tagName != null) { String data = new String(ch, start, length); //读取标签中的内容 if (this.tagName.equals("name")) { this.person.setName(data); Log.i("SAX", "处理name元素内容"); } else if (this.tagName.equals("age")) { this.person.setAge(Integer.parseInt(data)); Log.i("SAX", "处理age元素内容"); } } } /** * 处理元素结束时触发,这里将对象添加到结合中 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (localName.equals("person")) { this.persons.add(person); person = null; Log.i("SAX", "处理person元素结束~"); } this.tagName = null; } /** * 读取到文档结尾时触发, */ @Override public void endDocument() throws SAXException { super.endDocument(); Log.i("SAX", "读取到文档尾,xml解析结束"); } //获取persons集合 public ArrayList getPersons() { return persons; } }
그런 다음 MainActivity.java에 이러한 메서드를 작성하고 XML을 구문 분석할 때 호출합니다. 괜찮습니다~
private ArrayList readxmlForSAX() throws Exception { //获取文件资源建立输入流对象 InputStream is = getAssets().open("person1.xml"); //①创建XML解析处理器 SaxHelper ss = new SaxHelper(); //②得到SAX解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //③创建SAX解析器 SAXParser parser = factory.newSAXParser(); //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器 parser.parse(is, ss); is.close(); return ss.getPersons(); }
다른 단어:
그나저나, person1.xml 파일을 다음과 같이 정의하고 자산 디렉토리에 넣었다는 사실을 깜빡 잊었습니다! 파일 내용은 다음과 같습니다. person1.xml
SAX解析 18 XML1 43
세 가지 분석 방법을 하나의 데모로 결합하여 마지막에 모든 렌더링만 게시합니다. 여기서는 인쇄된 Log를 게시합니다. 모든 사람이 SAX XML 구문 분석 프로세스를 더 명확하게 이해할 것이라고 믿습니다.
또한 외부의 빈 텍스트도 텍스트 노드입니다! 이 노드는 분석 중에도 탐색됩니다!
4.DOM 구문 분석 XML 데이터
핵심 코드:
DomHelper.java
/** * Created by Jay on 2015/9/8 0008. */ public class DomHelper { public static ArrayList queryXML(Context context) { ArrayList Persons = new ArrayList(); try { //①获得DOM解析器的工厂示例: DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //②从Dom工厂中获得dom解析器 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); //③把要解析的xml文件读入Dom解析器 Document doc = dbBuilder.parse(context.getAssets().open("person2.xml")); System.out.println("处理该文档的DomImplemention对象=" + doc.getImplementation()); //④得到文档中名称为person的元素的结点列表 NodeList nList = doc.getElementsByTagName("person"); //⑤遍历该集合,显示集合中的元素以及子元素的名字 for(int i = 0;i < nList.getLength();i++) { //先从Person元素开始解析 Element personElement = (Element) nList.item(i); Person p = new Person(); p.setId(Integer.valueOf(personElement.getAttribute("id"))); //获取person下的name和age的Note集合 NodeList childNoList = personElement.getChildNodes(); for(int j = 0;j < childNoList.getLength();j++) { Node childNode = childNoList.item(j); //判断子note类型是否为元素Note if(childNode.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) childNode; if("name".equals(childElement.getNodeName())) p.setName(childElement.getFirstChild().getNodeValue()); else if("age".equals(childElement.getNodeName())) p.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue())); } } Persons.add(p); } } catch (Exception e) {e.printStackTrace();} return Persons; } }
코드 분석:
코드에서 DOM par의 프로세스를 볼 수 있습니다. XML을 노래하다, 먼저 전체 파일을 Dom 파서로 읽어온 다음 트리를 형성합니다. 그런 다음 노드 목록을 탐색하여 필요한 데이터를 얻을 수 있습니다!
5.PULL 구문 분석 XML 데이터
PULL을 사용하여 XML 데이터를 구문 분석하는 프로세스:
핵심 코드 :
public static ArrayList getPersons(InputStream xml)throws Exception { //XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance(); ArrayList persons = null; Person person = null; // 创建一个xml解析的工厂 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // 获得xml解析类的引用 XmlPullParser parser = factory.newPullParser(); parser.setInput(xml, "UTF-8"); // 获得事件的类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList(); break; case XmlPullParser.START_TAG: if ("person".equals(parser.getName())) { person = new Person(); // 取出属性值 int id = Integer.parseInt(parser.getAttributeValue(0)); person.setId(id); } else if ("name".equals(parser.getName())) { String name = parser.nextText();// 获取该节点的内容 person.setName(name); } else if ("age".equals(parser.getName())) { int age = Integer.parseInt(parser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if ("person".equals(parser.getName())) { persons.add(person); person = null; } break; } eventType = parser.next(); } return persons; }
Pull을 사용하여 XML 데이터를 생성하는 과정:
핵심 코드:
public static void save(List persons, OutputStream out) throws Exception { XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(out, "UTF-8"); serializer.startDocument("UTF-8", true); serializer.startTag(null, "persons"); for (Person p : persons) { serializer.startTag(null, "person"); serializer.attribute(null, "id", p.getId() + ""); serializer.startTag(null, "name"); serializer.text(p.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(p.getAge() + ""); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); out.flush(); out.close(); }
6. 코드 샘플 다운로드:
렌더링 실행:
코드 다운로드: XMLParseDemo.zip: 다운로드 XMLParseDe mo.zip
이 섹션 요약:
이 섹션에서는 Android, DOM, SAX 및 PULL에서 일반적으로 사용되는 세 가지 XML 구문 분석 방법을 소개합니다. 모바일 터미널에서는 후자를 사용하는 것이 좋습니다. 두 가지 유형이 있는데, PULL이 사용하기 더 간단하므로 여기서는 자세히 설명하지 않겠습니다. 코드가 가장 좋습니다~ 다음 섹션에서는 여기까지입니다. 안드로이드에서 제공하는 JSON 파싱 방법을 배워보세요! 감사합니다~