XML 파일 구문 분석 요약 SAX/DOM/PULL 세부 소개
읽다가 궁금한 점이나 오류가 있으면 댓글을 남기거나 Penguin 1262135886에 저를 추가해 주세요. SAX, DOM4J 및 PULL 구문 분석의 차이점을 지원해 주셔서 감사합니다
Sax 기능(SAX는 간단합니다 API for XML의 약어)
1. 파싱 효율이 높고 메모리 사용량이 적습니다
2. 언제든지
3. 전체 문서를 메모리에 로드할 수 없습니다
4. xml을 작성할 수 없습니다
5. SAX는 이벤트를 사용합니다. 🎜> 드라이버
pull과 sax의 차이점1. pull은 xml 파일을 읽은 후 해당 이벤트를 트리거하고 메서드를 호출하여 숫자를 반환합니다. 2. 풀은 프로그램에서 제어할 수 있고, 파싱하고 싶은 곳 어디든 멈출 수 있습니다3.장점
1. 전체
문서 트리가 메모리에 있으며, 삭제, 수정이 용이합니다. 재배열 등 기능2. 트리 구조를 통해 xml 문서에 접근
3. 트리의 노드에서 앞뒤로 이동할 수 있습니다
단점
1. 전체 문서를 메모리(쓸데없는 노드 포함)로 전송하므로 시간과 공간이 낭비됩니다.
적용 가능한 경우
문서가 구문 분석되면 데이터에 여러 번 액세스해야 합니다. 하드웨어 리소스 충분함(메모리, CPU)
먼저 정의 Student.xml 파일을 정의했습니다
**예**
[code]<?xml version="1.0" encoding="utf-8"?> <students> <student id="1" > <name> 小红 </name> <age> 21 </age> <sex> 女 </sex> <adress> 上海 </adress> </student> <student id="2" > <name> 小黑 </name> <age> 22 </age> <sex> 男 </sex> <adress> 天津 </adress> </student> <student id="3" > <name> 小网 </name> <age> 23 </age> <sex> 男 </sex> <adress> 北京 </adress> </student> </students>
**1.sax 구문 분석 * *
[code]package com.example.sax_xml; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.app.Activity; import android.content.res.AssetManager; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void sax_xml(View v) { // 得到设备管理者对象 AssetManager manager = this.getAssets(); try { // 获取到assets目录下的Student.xml文件输入流 InputStream is = manager.open("Student.xml"); /** * SAXParserFactory 定义了一个API工厂,使得应用程序可以配置和获得一个基于SAX(Simple API for * XML * * )的解析器,从而能够解析XML文档( 原文: Defines a factory API that enables * applications to configure and obtain a SAX based parser to parse * XML documents. ) * * 它的构造器是受保护的,因而只能用newInstance()方法获得实例( Protected constructor to * force use of newInstance(). ) */ SAXParserFactory factory = SAXParserFactory.newInstance(); /** * XmlReader 类是一个提供对 XML 数据的非缓存、只进只读访问的抽象基类。 该类符合 W3C 可扩展标记语言 (XML) * 1.0 和 XML 中的命名空间的建议。 XmlReader 类支持从流或文件读取 XML 数据。 * 该类定义的方法和属性使您可以浏览数据并读取节点的内容。 当前节点指读取器所处的节点。 * 使用任何返回当前节点值的读取方法和属性推进读取器。 XmlReader 类使您可以: 1. 检查字符是不是合法的 * XML字符,元素和属性的名称是不是有效的 XML 名称。 2. 检查 XML 文档的格式是否正确。 3. 根据 DTD * 或架构验证数据。 4.从 XML流检索数据或使用提取模型跳过不需要的记录。 */ XMLReader xmlReader = factory.newSAXParser().getXMLReader(); /** * ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法 * ,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件 * 。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。 */ //由于它是一个接口所以我直接编写一个类继承它的子类DefaultHandler,重新其方法 ContentHandler handler = new ContentHandler(); // 将ContentHandler的实例设置到XMLReader中 // setContentHandler此方法设置 XML 读取器的内容处理程序 xmlReader.setContentHandler(handler); // 开始执行解析 //InputSource:XML 实体的单一输入源。 xmlReader.parse(new InputSource(is)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
**자체 정의 ContentHandler 클래스**
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; public class ContentHandler extends DefaultHandler { private StringBuilder id; private StringBuilder name; private StringBuilder sex; private StringBuilder age; private StringBuilder adress; private String nodeName;// 记录当前节点的名字 // 开始xml解析的时候调用 @Override public void startDocument() throws SAXException { id = new StringBuilder(); name = new StringBuilder(); sex = new StringBuilder(); age = new StringBuilder(); adress = new StringBuilder(); } // 开始解析某个节点的时候调用 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { nodeName = localName; } // 获取某个节点中的内容时调用 @Override public void characters(char[] ch, int start, int length) throws SAXException { if ("id".equals(nodeName)) { id.append(ch, start, length); } else if ("name".equals(nodeName)) { name.append(ch, start, length); } else if ("age".equals(nodeName)) { age.append(ch, start, length); } else if ("sex".equals(nodeName)) { sex.append(ch, start, length); } else if ("adress".equals(nodeName)) { adress.append(ch, start, length); } } //完成某个节点的解析的时候调用 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("student".equals(localName)) { Log.d("ContentHandler", "id is" + id.toString().trim()); Log.d("ContentHandler", "name is" + name.toString().trim()); Log.d("ContentHandler", "age is" + age.toString().trim()); Log.d("ContentHandler", "sex is" + sex.toString().trim()); Log.d("ContentHandler", "adress is" + adress.toString().trim()); // 最后要将StringBuilder清空掉 id.setLength(0); name.setLength(0); age.setLength(0); sex.setLength(0); adress.setLength(0); } } //完成整个XML解析的时候调用 @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } }
**2.pull 분석**
[code]package com.example.xmlpull; import android.app.Activity; import android.content.res.AssetManager; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.Toast; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * 读取到xml的声明返回数字0 START_DOCUMENT; * 读取到xml的结束返回数字1 END_DOCUMENT ; * 读取到xml的开始标签返回数字2 START_TAG * 读取到xml的结束标签返回数字3 END_TAG * 读取到xml的文本返回数字4 TEXT * */ public class MainActivity extends Activity { /** * 用于装载解析出来的数据 */ private List<Map<String, Object>> oList; private Map<String, Object> oMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void btn_pull(View v) { // 获取设备管理器对象 AssetManager manager = this.getAssets(); try { // 得到assets文件下的Student.xml文件输入流 InputStream is = manager.open("Student.xml"); // 得到pull解析对象,它的构造器是受保护的,因而只能用newInstance()方法获得实例 XmlPullParser parser = Xml.newPullParser(); // 将xml文件输入流传给pull解析对象 parser.setInput(is, "UTF-8"); // 获取解析时的事件类型, int type = parser.getEventType(); // 使用while循环,如果解析的事件类型不等于全文档最后节点类型,一直解析 while (type != XmlPullParser.END_DOCUMENT) { // 得到当前的节点名字 String nodeName = parser.getName(); switch (type) { // 如果是全文档的开始节点类型 case XmlPullParser.START_DOCUMENT: // 初始化装载数据的集合 oList = new ArrayList<Map<String, Object>>(); break; // 如果是group开始节点类型 case XmlPullParser.START_TAG: // 根据解析的节点名字进行判断 if ("students".equals(nodeName)) { } else if ("student".equals(nodeName)) { oMap = new HashMap<String, Object>(); // 得到group开头的student节点 String id = parser.getAttributeValue(0); oMap.put("id", id); } else if ("name".equals(nodeName)) { // 节点对应的文本 String name = parser.nextText(); oMap.put("name", name); } else if ("sex".equals(nodeName)) { String sex = parser.nextText(); oMap.put("sex", sex); } else if ("age".equals(nodeName)) { String age = parser.nextText(); oMap.put("age", age); } else if ("adress".equals(nodeName)) { String adress = parser.nextText(); oMap.put("adress", adress); } break; // 到了group最后的节点 case XmlPullParser.END_TAG: if ("name".equals(nodeName)) { Toast.makeText(this, "姓名解析完成", Toast.LENGTH_LONG) .show(); } if ("student".equals(nodeName)) { oList.add(oMap); } break; } //切换到下一个group type = parser.next(); } } catch (Exception e) { e.printStackTrace(); } //最后遍历集合Log for (int i = 0; i < oList.size(); i++) { Log.e("error", "name:" + oList.get(i).get("name") + "----sex:" + oList.get(i).get("sex") + "----age:" + oList.get(i).get("age") + "----address:" + oList.get(i).get("adress")); } } }
먼저 이야기해 보겠습니다. DOM 분석 주의해야 할 사항, 선생님이 이에 대해 이야기할 때 실수를 했기 때문에 여기에 특별한 지적이 있습니다.
여기서 노드 학생을 얻을 때, 그림에서 화살표가 그려진 위치에서 getChildNodes() 메서드를 호출하면 얼마나 많은 자식 노드가 있는지 추측해 보세요. 손자 노드이므로 Xiaohong을 제외하고 손자 노드는 포함되지 않습니다. 여기에는 그림에서 검은색 수평선으로 표시된 총 5개의 하위 노드가 있습니다. 따라서 구문 분석 시 공백을 무시하지 않도록 주의하세요.
구체적인 파싱 코드는 아래 첨부합니다
여기서는 DOM 파싱 부분을 툴 클래스로 분할했습니다
[code]package com.example.domxml; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** *Dom解析是将xml文件全部载入,组装成一颗dom树, *然后通过节点以及节点之间的关系来解析xml文件,一层一层拨开 */ public class Dom_xml_Util { private List<Student> list = new ArrayList<Student>(); public List<Student> getStudents(InputStream in) throws Exception{ //获取dom解析工厂,它的构造器是受保护的,因而只能用newInstance()方法获得实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //使用当前配置的参数创建一个新的 DocumentBuilder 实例 //DocumentBuilder使其从 XML 文档获取 DOM 文档实例。 //使用此类,应用程序员可以从 XML 获取一个 Document DocumentBuilder builder = factory.newDocumentBuilder(); //获取Document Document document = builder.parse(in); //getDocumentElement()这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点 //Element 接口表示 HTML 或 XML 文档中的一个元素 Element element = document.getDocumentElement(); //以文档顺序返回具有给定标记名称的所有后代 Elements 的 NodeList NodeList bookNodes = element.getElementsByTagName("student"); //遍历NodeList //getLength()列表中的节点数 for(int i=0;i<bookNodes.getLength();i++){ //返回集合中的第 i个项 Element bookElement = (Element) bookNodes.item(i); Student student = new Student(); //得到item大节点中的属性值。 student.setId(Integer.parseInt(bookElement.getAttribute("id"))); //得到大节点中的小节点的Nodelist NodeList childNodes = bookElement.getChildNodes(); // System.out.println("*****"+childNodes.getLength()); //遍历小节点 for(int j=0;j<childNodes.getLength();j++){ /** * getNodeType()表示基础对象的类型的节点 * Node.ELEMENT_NODE 该节点为 Element * getNodeName()此节点的名称,取决于其类型 * getFirstChild() 此节点的第一个子节点 * getNodeValue()此节点的值,取决于其类型 */ if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){ if("name".equals(childNodes.item(j).getNodeName())){ student.setName(childNodes.item(j).getFirstChild().getNodeValue()); }else if("age".equals(childNodes.item(j).getNodeName())){ student.setAge(Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue())); }else if("sex".equals(childNodes.item(j).getNodeName())){ student.setSex(childNodes.item(j).getFirstChild().getNodeValue()); }else if("address".equals(childNodes.item(j).getNodeName())){ student.setAddress(childNodes.item(j).getFirstChild().getNodeValue()); } } }//end for j list.add(student); }//end for i return list; } }
[code]package com.example.domxml;
public class Student {
private int id;
private String name;
private int age;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
activity_main
[code]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv_id" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_age" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_sex" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_adress" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
MainActivity
[code]package com.example.domxml; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.app.Activity; import android.content.res.AssetManager; import android.view.Menu; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv_id,tv_name,tv_age,tv_sex,tv_adress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_id=(TextView)findViewById(R.id.tv_id); tv_name=(TextView)findViewById(R.id.tv_name); tv_age=(TextView)findViewById(R.id.tv_age); tv_sex=(TextView)findViewById(R.id.tv_sex); tv_adress=(TextView)findViewById(R.id.tv_adress); } public void bnt_parse(View v) { AssetManager manager=getAssets(); try { InputStream in=manager.open("Student.xml"); List<Student> oList =new ArrayList<Student>(); try { //返回一个泛型为Student的集合 oList = new Dom_xml_Util().getStudents(in); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //遍历集合,取集合中的第一组数据 for (int i = 0; i < oList.size(); i++) { tv_id.setText(oList.get(0).getId()); tv_name.setText(oList.get(0).getName()); tv_age.setText(oList.get(0).getAge()); tv_sex.setText(oList.get(0).getSex()); tv_adress.setText(oList.get(0).getAddress()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
위 내용은 XML 파일 구문 분석 요약 SAX/DOM/PULL 세부 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 기본 js는 DOM 노드를 가져옵니다. document.querySelector(선택기) document.getElementById(id 선택기) document.getElementsByClassName(클래스 선택기).... 2. vue2에서 현재 구성 요소의 인스턴스 객체를 가져옵니다. 각 vue Each 구성 요소 인스턴스에는 해당 DOM 요소 또는 구성 요소에 대한 참조를 저장하는 $refs 개체가 포함되어 있습니다. 따라서 기본적으로 구성 요소의 $refs는 빈 개체를 가리킵니다. 먼저 구성 요소에 ref="name"을 추가한 다음 this.$refs를 전달할 수 있습니다.

DOM은 문서 객체 모델이며 HTML 프로그래밍을 위한 인터페이스입니다. 페이지의 요소는 DOM을 통해 조작됩니다. DOM은 HTML 문서의 메모리 내 개체 표현이며 JavaScript를 사용하여 웹 페이지와 상호 작용하는 방법을 제공합니다. DOM은 문서 노드를 루트로 하는 노드의 계층 구조(또는 트리)입니다.

Vue3ref 바인딩 DOM 또는 컴포넌트 실패 이유 분석 시나리오 설명 Vue3에서는 컴포넌트 또는 DOM 요소를 바인딩하기 위해 ref를 사용하는 경우가 많습니다. ref는 관련 컴포넌트를 바인딩하는 데 명확하게 사용되지만 ref 바인딩은 종종 실패합니다. 참조 바인딩 실패 상황의 예 참조 바인딩이 실패하는 대부분의 경우는 참조가 구성 요소에 바인딩될 때 구성 요소가 아직 렌더링되지 않아 바인딩이 실패하는 것입니다. 또는 컴포넌트가 처음에 렌더링되지 않고 ref가 바인딩되지 않은 경우 컴포넌트가 렌더링되기 시작하면 ref도 바인딩되기 시작하지만 이때 ref와 컴포넌트 간의 바인딩이 완료되지 않는 문제가 발생합니다. 구성 요소 관련 방법을 사용할 때. ref에 바인딩된 구성 요소는 v-if를 사용하거나 상위 구성 요소는 v-if를 사용하여 페이지를

웹 개발에 있어서 DOM(DocumentObjectModel)은 매우 중요한 개념입니다. 이를 통해 개발자는 웹페이지의 HTML이나 XML 문서에 요소 추가, 삭제, 수정 등을 쉽게 수정하고 운영할 수 있습니다. PHP에 내장된 DOM 작업 라이브러리는 개발자에게 풍부한 기능을 제공합니다. 이 기사에서는 모든 사람에게 도움이 되기를 바라며 PHP의 DOM 작업 가이드를 소개합니다. DOM DOM의 기본 개념은 크로스 플랫폼이며 언어 독립적인 API입니다.

"문서", "요소", "노드", "이벤트" 및 "창"을 포함한 5개의 DOM 개체가 있습니다. 2. "창", "네비게이터", "위치" 및 "역사" 및 "화면" 및 기타 5개; BOM 객체의 유형.

BOM과 DOM은 역할과 기능, JavaScript와의 관계, 상호의존성, 다양한 브라우저의 호환성, 보안 고려사항 측면에서 다릅니다. 세부 소개: 1. 역할 및 기능 BOM의 주요 기능은 브라우저 창에 대한 직접 액세스 및 제어를 제공하는 반면, DOM의 주요 기능은 웹 문서를 개체 트리로 변환하는 것입니다. 개발자는 이 개체 트리를 사용하여 웹 페이지의 요소와 콘텐츠를 얻고 수정합니다. 2. JavaScript와의 관계

dom内置对象에는 1, 문서, 2, 창, 3, 네비게이터, 4, 위치, 5, 역사, 6, 화면, 7, document.documentElement, 8, document.body, 9, document.head, 10, 문서가 있습니다. .title;11、document.cookie。

소개: XML 데이터 처리는 다양한 Java 애플리케이션에서 일반적인 작업입니다. 원활한 성능과 응답성을 보장하려면 XML 처리를 최적화하는 것이 중요합니다. 이 기사에서는 개발자가 Java 애플리케이션에서 XML 처리의 효율성과 성능을 향상시키는 데 도움이 되는 일련의 팁을 제공합니다. SAX 파서 사용: SAX(Simple API for XML)는 대규모 XML 문서를 처리할 때 매우 효율적인 이벤트 기반 파서입니다. SAX 파서는 XML 요소를 하나씩 구문 분석하여 구문 분석에 필요한 최소한의 정보만 저장하므로 메모리 소비 및 처리 시간을 최소화합니다. SAXParserFactoryfactory=SAXParserFactory.newInstan
