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基礎學習:JavaWeb之ServletJavaWebServlet
- JAVA基礎學習篇之反射Java反射
- Java學習之基礎語法Java
- Java學習之基礎語法練習Java
- java基礎學習_io流之FileInputStreamJava
- java基礎學習:JavaWeb之JSPJavaWebJS
- java基礎學習之十三:泛型Java泛型
- java基礎學習之十二:控制流Java
- Java基礎學習Java
- java基礎學習:JavaWeb之Cookie和SessionJavaWebCookieSession
- java基礎學習:JavaWeb之request和responseJavaWeb
- Java基礎之IO轉換流學習Java
- java基礎學習之類集框架(十)Java框架
- java基礎學習之四:修飾符Java
- JAVA學習--JAVA基礎(一)Java
- java基礎的學習Java
- opencv學習之基礎OpenCV
- java基礎學習之七:陣列型別Java陣列型別
- java基礎學習之六:String型別Java型別
- XML - Schema之基礎示例XML
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- java基礎學習(目錄)Java
- Java基礎 快速學習(二)Java
- Java基礎 快速學習(三)Java
- Java基礎 快速學習(四)Java
- java語言基礎學習Java
- java基礎學習筆記Java筆記
- java基礎學習之十一:BigDecimal和BigIntegerJavaDecimal
- java基礎學習之五:引用資料型別Java資料型別
- 【Elasticsearch學習】之基礎概念Elasticsearch
- 深度學習基礎之 Dropout深度學習
- Java EE之旅06 XML基礎JavaXML
- Qt學習之XMLQTXML
- Java基礎學習之陣列基本屬性和方法Java陣列
- java基礎學習之九:集合型別Set/List/MapJava型別
- java基礎的學習之引數的變化使用Java