java基礎學習之--XML
剛學習完java中XML的知識點,由於涉及的知識點較多,在下文中進行簡要總結,為以後複習以及對XML不瞭解的朋友學習之用。
XML(Extensible Markup Language可擴充套件標記語言),XML是一個以文字來描述資料的文件。
一、常用的解析XML的工具:
1、DOM(Document Object Model)文件物件模型
2、SAX
3、JDOM
4、DOM4J
(1)建立SAX解析器工廠物件
(2)根據工廠建立解析器物件
(3)開始解析
在Sax解析XML時,一個重要的過程是建立SAX解析的內容處理器,該處理器需要繼承DefaultHandler類,並重寫其中的五個方法:
①XML文件開始解析時呼叫的方法startDocument()
②解析開始元素時呼叫的方法startElement(String uri, String localName, String qName,
Attributes attributes)
③解析結束元素時呼叫的方法 endElement(String uri, String localName, String qName)
④解析文字內容時呼叫的方法 characters(char[] ch, int start, int length)
⑤XML文件解析完成呼叫的方法endDocument()
(1)建立解析器
(2)開始解析
(3)獲取根元素
(4)獲取根元素下的所有子元素列表
(5)遍歷
(6)獲取當前元素的子元素的文字內容
(7)輸出
(1)建立解析器
(2)開始解析,並返回Document物件
(3)獲取根元素的所有子元素
(4)輸出
相關程式碼為:
DOM在解析XML文件時,需要將XML文件全部讀入記憶體中然後進行解析,所以使用DOM解析時對記憶體的消耗比較大;而SAX以事件的方式讀入記憶體一行然後解析一行,不需要將文件全部讀入記憶體,因此對記憶體的消耗較小。
XML(Extensible Markup Language可擴充套件標記語言),XML是一個以文字來描述資料的文件。
一、常用的解析XML的工具:
1、DOM(Document Object Model)文件物件模型
2、SAX
3、JDOM
4、DOM4J
總體來說,應該分成兩類,一類是:DOM,另一類是SAX。而JDOM和DOM4J都是在DOM的基礎上進行改進的。
二、具體的解析步驟和流程:
1、Dom解析XML:
(1)建立dom解析器工廠
(2)通過解析器工廠建立解析器
(3)構造一個指向指定檔案的輸入流
(4)開始解析,並返回Document物件
(5)根據文件的節點獲取資料
(6)獲取當前節點的屬性的值
(7)獲取當前節點下的所有子節點列表
相關程式碼為:
//建立dom解析器工廠
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通過解析器工廠建立解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//構造一個指向指定檔案的輸入流
InputStream is=Thread.currentThread().
getContextClassLoader().getResourceAsStream("person.xml");
//開始解析,並返回Document物件
Document doc=db.parse(is);
List<Teacher>teachers=new ArrayList<Teacher>();
Teacher t=null;
//根據文件的節點獲取資料
NodeList nodeList=doc.getElementsByTagName("teacher");
t=new Teacher();
for (int i = 0; i < nodeList.getLength(); i++) {
Node teacherNode=nodeList.item(i);
//獲取當前節點的屬性id的值
String id=teacherNode.getAttributes().getNamedItem("id").getNodeValue();
System.out.println(id);
t.setId(Integer.parseInt(id));//將字串型別的id轉換成整數
//獲取當前節點下的所有子節點列表
NodeList childNodeList=teacherNode.getChildNodes();
for (int j = 0; j < childNodeList.getLength(); j++) {
//獲取主節點下的一個子節點
Node childNode=childNodeList.item(j);
String tagName=childNode.getNodeName();
if("name".equals(tagName)){
t.setName(childNode.getFirstChild().getNodeValue());
}else if("desc".equals(tagName)){
t.setDesc(childNode.getFirstChild().getNodeValue());
}
}
teachers.add(t);
}
//輸出
System.out.println(teachers);
2、Sax解析XML:(1)建立SAX解析器工廠物件
(2)根據工廠建立解析器物件
(3)開始解析
在Sax解析XML時,一個重要的過程是建立SAX解析的內容處理器,該處理器需要繼承DefaultHandler類,並重寫其中的五個方法:
①XML文件開始解析時呼叫的方法startDocument()
②解析開始元素時呼叫的方法startElement(String uri, String localName, String qName,
Attributes attributes)
③解析結束元素時呼叫的方法 endElement(String uri, String localName, String qName)
④解析文字內容時呼叫的方法 characters(char[] ch, int start, int length)
⑤XML文件解析完成呼叫的方法endDocument()
相關程式碼為:
public class PersonHandler extends DefaultHandler {
private List<Teacher> teachers=null;
private Teacher teacher;
private String tag;
public List<Teacher> getTeachers() {
return teachers;
}
//XML文件開始解析時呼叫的方法
@Override
public void startDocument() throws SAXException {
teachers=new ArrayList<Teacher>();
}
//解析開始元素時呼叫的方法
//uri:名稱空間
//localName:不帶字首的元素的本地名稱
//qName:帶字首的元素名稱
//attributes:屬性的集合
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("teacher".equals(qName)){
teacher=new Teacher();
//取出屬性,並新增到teacher中
teacher.setId(Integer.parseInt(attributes.getValue("id"))) ;
}
tag=qName;
}
//解析結束元素時呼叫的方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("teacher".equals(qName)){
teachers.add(teacher);
}
tag=null;
}
//解析文字內容時呼叫的方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag!=null){
if("name".equals(tag)){
teacher.setName(new String(ch,start,length));
}else if("desc".equals(tag)){
teacher.setDesc(new String(ch,start,length));
}
}
}
//XML文件解析完成呼叫的方法
@Override
public void endDocument() throws SAXException {
System.out.println("XML解析完畢");
}
}
3、JDOM解析XML:(1)建立解析器
(2)開始解析
(3)獲取根元素
(4)獲取根元素下的所有子元素列表
(5)遍歷
(6)獲取當前元素的子元素的文字內容
(7)輸出
相關程式碼為:
//建立解析器
SAXBuilder builder=new SAXBuilder();
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//開始解析
Document doc=builder.build(in);
//獲取根元素
Element root=doc.getRootElement();
//獲取根元素下的所有子元素列表
List<Element> list=root.getChildren();
List<Teacher> teachers=new ArrayList<Teacher>();
//遍歷
for (int i = 0; i < list.size(); i++) {
Teacher t=new Teacher();
Element e=list.get(i);
String id=e.getAttributeValue("id");
t.setId(Integer.parseInt(id));
//獲取當前元素的子元素的文字內容
t.setName(e.getChildText("name"));
t.setDesc(e.getChildText("desc"));
teachers.add(t);
}
//輸出
System.out.println(teachers);
}
4、DOM4J解析XML:(1)建立解析器
(2)開始解析,並返回Document物件
(3)獲取根元素的所有子元素
(4)輸出
相關程式碼為:
//建立解析器
SAXReader reader=new SAXReader();
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//開始解析,並返回Document物件
Document doc=reader.read(in);
Element root=doc.getRootElement();
//獲取根元素的所有子元素
Iterator<Element> iters=root.elementIterator();
List<Teacher> list=new ArrayList<Teacher>();
while(iters.hasNext()){
Teacher t=new Teacher();
Element e=iters.next();
t.setId(Integer.parseInt(e.attributeValue("id")));
t.setName(e.elementText("name"));
t.setDesc(e.elementText("desc"));
list.add(t);
}
//輸出
System.out.println(list);
三、DOM和SAX的比較:DOM在解析XML文件時,需要將XML文件全部讀入記憶體中然後進行解析,所以使用DOM解析時對記憶體的消耗比較大;而SAX以事件的方式讀入記憶體一行然後解析一行,不需要將文件全部讀入記憶體,因此對記憶體的消耗較小。
相關文章
- java基礎之XMLJavaXML
- JAVA基礎學習篇之反射Java反射
- Java學習之基礎語法Java
- java基礎學習:JavaWeb之JSPJavaWebJS
- java基礎學習:JavaWeb之ServletJavaWebServlet
- Java學習之基礎語法練習Java
- java基礎學習_io流之FileInputStreamJava
- java基礎學習之類集框架(十)Java框架
- Java基礎之IO轉換流學習Java
- java基礎學習:JavaWeb之request和responseJavaWeb
- java基礎學習:JavaWeb之ServletConfig與ServletContextJavaWebServletContext
- java基礎學習:JavaWeb之Cookie和SessionJavaWebCookieSession
- JAVA學習--JAVA基礎(一)Java
- Qt學習之XMLQTXML
- opencv學習之基礎OpenCV
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Java基礎學習筆記Java筆記
- java基礎學習(目錄)Java
- 深度學習基礎之 Dropout深度學習
- 【Elasticsearch學習】之基礎概念Elasticsearch
- pandas學習之Python基礎Python
- XML基礎XML
- 第65節:Java後端的學習之Spring基礎Java後端Spring
- Java基礎-學習筆記17Java筆記
- Java基礎-學習筆記07Java筆記
- Java基礎-學習筆記06Java筆記
- Java基礎-學習筆記05Java筆記
- Java基礎-學習筆記04Java筆記
- Java基礎類String學習分析Java
- 學習java需要什麼基礎Java
- C++ -> Java快速學習-基礎C++Java
- java webService 零基礎學習JavaWeb
- Java 基礎學習系列一 —— Java 主要特性Java
- python基礎學習之 特徵工程Python特徵工程
- Python基礎學習之迴圈Python
- Java學習筆記01 - JavaSE基礎Java筆記
- 零基礎怎麼學習Java?Java
- Java零基礎學習難嗎Java