java基礎學習之--XML

SadOnMyOwn發表於2016-03-10
          剛學習完java中XML的知識點,由於涉及的知識點較多,在下文中進行簡要總結,為以後複習以及對XML不瞭解的朋友學習之用。
        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以事件的方式讀入記憶體一行然後解析一行,不需要將文件全部讀入記憶體,因此對記憶體的消耗較小。



相關文章