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