java解析XML文件-DOM解析法與SAX解析法

(1)DOM解析法

1.在src下創建class.xml文件

<class classId="a10">
  <student stuId="1">
     <name>張三</name>
     <sex>女</sex>
     <age>20</age>
  </student>
  <student stuId="2">
     <name>李四</name>
     <sex>男</sex>
     <age>19</age>
  </student>
  <student stuId="3">
     <name>王五</name>
     <sex>男</sex>
     <age>21</age>
  </student>
</class>

2.創建java程序Demo.java直接解析class.xml文件

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Demo {
   public static void main(String[] args) {
	   //得到當前類的加載器,負責加載類 加載到虛擬機 得到資源
	   String path=Demo.class.getClassLoader().getResource("class.xml").getPath();
	   //創建Demo解釋器工廠類 
	   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
       try {
		//利用工廠創建一個解釋器
    	DocumentBuilder db=dbf.newDocumentBuilder();
		//通過當前的解釋器的解析得到當前的XML文件和XML文檔模型
    	Document document=db.parse(path);
		//通過得到的文檔模型得到根節點
    	Element rootElement=document.getDocumentElement();
		//通過得到的根節點得到根節點屬性的集合
    	NamedNodeMap rootattr=rootElement.getAttributes();
//		System.out.println(rootElement.getTagName());
		//遍歷根節點屬性集合
		if(rootattr!=null&&rootattr.getLength()>0){
			for(int i=0;i<rootattr.getLength();i++){
				Node n=rootattr.item(i);
				System.out.println(n.getNodeName()+"\t"+n.getNodeValue());
			}
		}
		//通過得到的根節點得到根節點的所有子節點
		NodeList studentList=rootElement.getChildNodes();
		for(int j=0;j<studentList.getLength();j++){
			//得到student子節點的屬性集合
			Node s=studentList.item(j);
			//遍歷屬性集合
//			System.out.println(s.getNodeName());
			NamedNodeMap stuattr=s.getAttributes();
			if(stuattr!=null&&stuattr.getLength()>0){
				for(int k=0;k<stuattr.getLength();k++){
					Node sa=stuattr.item(k);
					System.out.println(sa.getNodeName()+"\t"+sa.getNodeValue());
				}
			}
			//通過得到的student子節點得到student的所有子節點集合
			NodeList stuChildList=s.getChildNodes();
			//遍歷student子節點集合
			for(int h=0;h<stuChildList.getLength();h++){
				Node c=stuChildList.item(h);
				if(c.getNodeName().equals("name")){
					System.out.println("name:"+c.getTextContent());
				}
				if(c.getNodeName().equals("sex")){
					System.out.println("sex:"+c.getTextContent());
				}
				if(c.getNodeName().equals("age")){
					System.out.println("age:"+c.getTextContent());
				}
			}
		}
		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
   }
}

wKioL1cUTJbgixxUAAA_ORyXMko473.png

3.引用對象創建student.java將以下studen.xml文件中需要解析的屬性和節點進行封裝

班級>
   <學生 編號="A001">
     <姓名>張三</姓名>
     <年齡>23</年齡>
     <電子郵箱>[email protected]</電子郵箱>
     <電子郵箱>[email protected]</電子郵箱>
     <身高>179.5</身高>
     <電話>686868</電話>
     <單位>
        xxx公司 
        <地址>上海</地址>
        <郵編>100002</郵編>
     </單位>
  </學生>
  <學生 編號="A0003">
     <姓名>李四</姓名>
     <年齡>24</年齡>
     <電子郵箱>[email protected]</電子郵箱>
     <身高>168.0</身高>
     <電話>135013562554</電話>
     <單位>
        <地址>北京</地址>
     </單位>
  </學生>
</班級>

封裝屬性

public class Student {
	 private String stuid;
	 private int age;
	 private double height;
	 private String name;
	 private String tel;
	 private String email1;
	 private String email2;
	 private String unit;
	 private String addressu;
	 private String emailu;
	 private String company;
	 
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String getStuid() {
		return stuid;
	}
	public void setStuid(String stuid) {
		this.stuid = stuid;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getEmail1() {
		return email1;
	}
	public void setEmail1(String email1) {
		this.email1 = email1;
	}
	public String getEmail2() {
		return email2;
	}
	public void setEmail2(String email2) {
		this.email2 = email2;
	}
	public String getUnit() {
		return unit;
	}
	public void setUnit(String unit) {
		this.unit = unit;
	}
	public String getAddressu() {
		return addressu;
	}
	public void setAddressu(String addressu) {
		this.addressu = addressu;
	}
	public String getEmailu() {
		return emailu;
	}
	public void setEmailu(String emailu) {
		this.emailu = emailu;
	}
}

以對象的形式進行DOM解析student.xml文件

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Demostu {
	public static void main(String[] args) {
		String path=Demo.class.getClassLoader().getResource("student.xml").getPath();
		List<Student> li=parseXMLToObject(path);
		for(int i=0;i<li.size();i++){
			Student p=new Student();
			p=li.get(i);
			System.out.println(p.getStuid());
			System.out.println(p.getName());
			System.out.println(p.getAge());
			System.out.println(p.getHeight());
			System.out.println(p.getEmail1());
			System.out.println(p.getEmail2());
			System.out.println(p.getTel());
			System.out.println(p.getUnit());
		}
	   }
	   public static List<Student> parseXMLToObject(String path){
		   List<Student> list=new ArrayList<Student>();
		   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		   try {
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document document=db.parse(path);
			Element rootElement=document.getDocumentElement();
			NodeList studentList=rootElement.getChildNodes();
			Student s;
			for(int i=0;i<studentList.getLength();i++){
				s=new Student();
				Node studentNode=studentList.item(i);
				NamedNodeMap attr=studentNode.getAttributes();
				if(attr!=null&&attr.getLength()>0){
					for(int j=0;j<attr.getLength();j++){
						Node n=attr.item(j);
						if(n.getNodeName().equals("編號")){
							s.setStuid(n.getNodeValue());
						}
					}
				}
				NodeList nasList=studentNode.getChildNodes();
				if(nasList!=null&&nasList.getLength()>0){
					for(int h=0;h<nasList.getLength();h++){
						Node m=nasList.item(h);
						if(m.getNodeName().equals("姓名")){
							s.setName(m.getTextContent());
						}
						if(m.getNodeName().equals("年齡")){
							s.setAge(Integer.parseInt(m.getTextContent()));
						}
						if(m.getNodeName().equals("電子郵箱")){
							if(s.getEmail1()!=null){
								s.setEmail2(m.getTextContent());
							}
							if(s.getEmail1()==null){
								s.setEmail1(m.getTextContent());
							}
						}
						if(m.getNodeName().equals("身高")){
							s.setHeight(Double.parseDouble(m.getTextContent()));
						}
						if(m.getNodeName().equals("電話")){
							s.setTel(m.getTextContent());
						}
						if(m.getNodeName().equals("單位")){
							s.setUnit(m.getTextContent());
						}
					}
					if(s!=null&&studentNode.getNodeName().equals("學生")){
						list.add(s);
					}
				}
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		   
		   return list;
	   }
}

wKiom1cUTBDSZXdsAABS80PQ0ew104.png

(2)SAX解析法

1.在src下創建book.xml文件

<book>
  <title>Java實例一百例</title>
  <page id="1">
    <title>基礎知識篇</title>
    <file>base.htm</file>
  </page>
  <page id="3">
    <title>SWING篇</title>
    <file>swing.htm</file>
  </page>
  <page id="28">
    <title>EJB篇</title>
    <file>ejb.htm</file>
  </page>
  <page id="33">
    <title>DOM篇</title>
    <file>xmldom.htm</file>
  </page>
</book>

2.創建MyHander類繼承DefaultHandler類

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHander extends DefaultHandler{

	@Override
	public void startDocument() throws SAXException {
		System.out.println("開始文檔解析!");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("文檔解析結束!");
	}
	
	String tagName;
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		tagName=qName;
		if(tagName.equals("page")){
			System.out.println("編號:"+attributes.getValue("id"));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		tagName="";
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if(tagName.equals("title")){
			String content=new String(ch).substring(start, start+length);
			System.out.println("標題:"+content);
		}
		if(tagName.equals("file")){
			String content=new String(ch).substring(start, start+length);
			System.out.println("文件:"+content);
		}
	}
}

3.創建Test類進行文檔解析

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


public class Test {
	public static void main(String[] args) {
		String path=Test.class.getClassLoader().getResource("book.xml").getPath();
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			SAXParser sp=factory.newSAXParser();
			sp.parse(new File(path), new MyHander());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

wKioL1cZkgWA9r_qAAA74Y9mzi8061.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章