(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</年龄> <电子邮箱>zhangsn@qq.com</电子邮箱> <电子邮箱>zhangsan@yahoo.com</电子邮箱> <身高>179.5</身高> <电话>686868</电话> <单位> xxx公司 <地址>上海</地址> <邮编>100002</邮编> </单位> </学生> <学生 编号="A0003"> <姓名>李四</姓名> <年龄>24</年龄> <电子邮箱>lisi@263.com</电子邮箱> <身高>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();
}
}
}