xml三步曲之二:java读取xml的4种方法DOM DOM4J SAX JDOM

读取的xml文件如下:

根层次为company,下面二层次为apartment,其下三层次为staff,其下为staff的特征值。

为便于理解,命令、解读均以此为准。

原文如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
    <apartment id="1">
        <staff id="001">
            <name>001老大</name>
            <age>40</age>
        </staff>
    </apartment>
    <apartment id="2">
        <staff id="002">
            <name>002老大</name>
            <age>50</age>
        </staff>
    </apartment>
</company>

第一种方法:DOM方法

package xml.read;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class ReadXmlByDom {
    public void readXMLByDom() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        //解析器整个解析,读入内存,然后再进行后期的操作
        //根层次,表达公司信息
        Document company = builder.parse(new File("company.xml"));
        NodeList apartmentList = company.getElementsByTagName("apartment");//获取部门信息
        //第二层次,对公司内部的每个部门进行解析
        int index = 0;
        for (int i = 0; i < apartmentList.getLength(); i++) {
            Node apartment = apartmentList.item(i);//获取第一个部门的信息
            Node apartmentIDNode = apartment.getAttributes().getNamedItem("id");
            int apartmentID = Integer.parseInt(apartmentIDNode.getNodeValue());
            //第三层次,获取部门内的所有员工
            NodeList staffs = apartment.getChildNodes();
            for (int j = 0; j < staffs.getLength(); j++) {
                //对每个员工信息进行记录
                Staff staff = new Staff();
                staff.setApartment(apartmentID);//设置部门ID
                //去除掉冗余节点
                if(!(staffs.item(j) instanceof Element))
                    continue;
                Node staffNode = staffs.item(j);
                Node staffIDNode = staffNode.getAttributes().getNamedItem("id");
                int staffID = Integer.parseInt(staffIDNode.getNodeValue());
                staff.setId(staffID);//设置员工ID
                //不使用循环,直接获取指定节点的值,因为只有两个,就用个简单点的
                //抱歉,为了成功获取所有节点,把index的赋值放到二层循环里面了
                String name = company.getElementsByTagName("name").item(index).getTextContent();
                staff.setName(name);
                int age = Integer.parseInt(company.getElementsByTagName("age").item(index).getTextContent());
                index++;
                staff.setAge(age);
                staff.print();
            }
        }
    }

    public static void main(String[] args) throws Exception{
        new ReadXmlByDom().readXMLByDom();
    }
}
//打印输出
//Apartment: 1 name: 001老大 id: 1 age: 40
//Apartment: 2 name: 002老大 id: 2 age: 50

class Staff {
    String name;
    int apartment, id, age;

    public void setApartment(int apartment) {
        this.apartment = apartment;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void print() {
        System.out.println("Apartment: " + apartment + " name: " + name + " id: " + id + " age: " + age);
    }
}

第二种方法:DOM4J

package xml.read;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;

public class ReadXmlByDOM4J {
    public void readXmlByDOM4J() throws Exception {
        //获取整个DOM树
        Document company = new SAXReader().read(new File("company.xml"));
        //获取DOM树的迭代器
        Iterator it = company.getRootElement().elementIterator();
        //现在开始逐一对部门信息进行分析
        while (it.hasNext()) {
            Element apartment = (Element) it.next();//获取部门节点
            //打印部门ID值
            System.out.println("apartment ID = " + apartment.attributeValue("id"));
            //因为xml文件里只有一个员工,不采取循环(不符合业务逻辑,用于尝试不同的方法)
            Element staff = apartment.element("staff");//获取员工节点
            //打印员工ID值
            System.out.println("staff ID = " + staff.attributeValue("id"));
            //打印员工姓名
            System.out.println("staff name = " + staff.elementText("name"));
            //打印员工年龄
            System.out.println("staff age = " + staff.elementTextTrim("age"));
        }
    }
    public static void main(String[] args) throws Exception {
        new ReadXmlByDOM4J().readXmlByDOM4J();
    }
}

打印输出信息如下:

apartment ID = 1
staff ID = 001
staff name = 001老大
staff age = 40
apartment ID = 2
staff ID = 002
staff name = 002老大
staff age = 50

第三种方法:JDOM

package xml.read;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.File;
import java.util.List;

public class ReadXmlByJDOM {
    public void readXmlByJDOM() throws Exception {
        //构建整个DOM树,获取company值
        Document document = new SAXBuilder().build(new File("company.xml"));
        Element company = document.getRootElement();
        List<Element> apartments = company.getChildren();
        for(Element apartment : apartments) {
            //打印apartment的ID值
            System.out.print("apartment ID = " + apartment.getAttributeValue("id"));
            Element staff = apartment.getChild("staff");//只有一个员工
            //打印员工ID name age
            System.out.print(" staff ID = " + staff.getAttributeValue("id"));
            System.out.print(" staff name = " + staff.getChildText("name"));
            System.out.print(" staff age = " + staff.getChildText("age") + "\n");
        }
    }

    public static void main(String[] args) throws Exception {
        new ReadXmlByJDOM().readXmlByJDOM();
    }
}

输出信息如下:

apartment ID = 1 staff ID = 001 staff name = 001老大 staff age = 40
apartment ID = 2 staff ID = 002 staff name = 002老大 staff age = 50

第四种方法SAX

package xml.read;

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

public class ReadXmlBySAX {
    public void readXMLBySAX() throws Exception{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser  parser = factory.newSAXParser();
        parser.parse(new File("company.xml"), new ReadHandler());
    }
    public static void main(String[] args) throws Exception{
        new ReadXmlBySAX().readXMLBySAX();
    }
}
package xml.read;

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

public class ReadHandler extends DefaultHandler {
    Staff staff = new Staff();//用于记录每个员工的信息
    String tagName;//全局变量,记录标签名

    @Override
    public void startElement(String uri, String localName,
                             String qName, Attributes attributes)
            throws SAXException {
        if (qName.equals("apartment"))
            //如果节点是apartment,则读取id到staff里面
            staff.setApartmentID(Integer.parseInt(attributes.getValue("id")));
        else if (qName.equals("staff"))
            staff.setStaffID(Integer.parseInt(attributes.getValue("id")));
        tagName = qName;
    }

    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
        String text = new String(ch, start, length);
        if (tagName == null || text.contains("\n")) //text会获取换行符,所以需要另外去掉
            return;
        if (tagName.equals("name"))
            staff.setName(text);
        else if (tagName.equals("age"))
            staff.setAge(Integer.parseInt(text));
        }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equals("staff")) {
            staff.Print();
        }
    }
}

class Staff {
    int apartmentID, staffID, age;
    String name;

    public void setApartmentID(int apartmentID) {
        this.apartmentID = apartmentID;
    }

    public void setStaffID(int staffID) {
        this.staffID = staffID;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void Print() {
        System.out.print("apartment id = " + apartmentID + " staff id = " + staffID + " name = " + name + " age = " + age + "\n");
    }
}

效果图如下:

apartment id = 1 staff id = 1 name = 001老大 age = 40
apartment id = 2 staff id = 2 name = 002老大 age = 50

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值