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();
	}
   }
}

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;
	   }
}

java解析XML文件-DOM解析法与SAX解析法_第1张图片

(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();
		}
	}
}

你可能感兴趣的:(xml,解析,dom)