XML文档解析

1. XML文档解析

1.1 DOM4J概述
DOM4J是一个易用的开源的库,可以实现对XML文档的解析。DOM4J使用起来非常简单,只要了解甘醇的XML-DOM模型,就能使用。DOM4J最大的特色是使用大量的接口。目前,DOM4J的使用越来越广泛。
1.2 使用DOM4J操作XML文档 需要下载DOM4J包,在DOM4J官方网站下载后将相应的包加入工程就可以使用了。附上官网网址:
http://sourceforge.net/projects/dom4j/files/
1.3 接下来用一个示例来演示XML文档的解析:
使用DOM4J读取下面XML文档中所有的学生信息,文件名为:studentInfo.xml 且放在src目录下。XML文档结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student age="25"><!-- 如果没有age属性,默认的为20 -->
        <name>秦羽</name>
        <college>PC学院</college>
        <telephone>62354666</telephone>
        <notes>男,1985年生,硕士,现就读于北京邮电大学</notes>
    </student>
    <student>
        <name>黑羽</name>
        <college leader="leader">PC学院</college>
        <telephone>62354999</telephone>
        <notes>男,1987年生,硕士,现就读于北京邮电大学</notes>
    </student>
</students>

实现步骤
(1)导入DOM4J的jar包。这个jar包就是你下载的DOM4J解压后的根目录下这个:dom4j-1.6.1.jar
(2)指定要解析的XML文件。
(3)把XML文件转换成Document对象。
(4)获取节点属性或文本的值
关键代码
Dom4jReadExample.java:

package test;

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

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

public class Dom4jReadExample {

    /**
     * 遍历整个XML文件,获取所有节点的值与其属性 值,并放入HashMap中
     * 
     * @param filename
     *            String 待遍历的XML文件(相对路径或者绝对路径)
     * @param hm
     *            HashMap 存放遍历结果
     */
    @SuppressWarnings("rawtypes")
    public void iterateWholeXML(String filename, HashMap<String, String> hm) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(new File(filename));
            Element root = document.getRootElement();
            int num = -1; // 用于记录学生编号的变量
            // 遍历根元素(students)的所有子节点(肯定是student节点)
            for (Iterator iter = root.elementIterator(); iter.hasNext();) {
                Element element = (Element) iter.next();
                num++;
                // 获取person节点的age属性的值
                Attribute ageAttr = element.attribute("age");
                if (ageAttr != null) {
                    String age = ageAttr.getValue();
                    if (age != null && !age.equals("")) {
                        hm.put(element.getName() + "-" + ageAttr.getName()
                                + num, age);
                    } else {
                        hm.put(element.getName() + "-" + ageAttr.getName()
                                + num, "20");
                    }
                } else {
                    hm.put(element.getName() + "-age" + num, "20");
                }
                for (Iterator iterInner = element.elementIterator(); iterInner
                        .hasNext();) {
                    Element elementInner = (Element) iterInner.next();
                    if (elementInner.getName().equals("college")) {
                        hm.put(elementInner.getName() + num,
                                elementInner.getText());
                        // 获取college节点的leader属性的值
                        Attribute leaderAttr = elementInner.attribute("leader");
                        if (leaderAttr != null) {
                            String leader = leaderAttr.getValue();
                            if (leader != null && !leader.equals("")) {
                                hm.put(elementInner.getName() + "-"
                                        + leaderAttr.getName() + num, "leader");
                            }
                        }else{
                            hm.put(elementInner.getName()+"-leader"+num, "leader");
                        }
                    }else{
                        hm.put(elementInner.getName()+num, elementInner.getText());
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }
}

TestDom4jReadExample.java 关键代码:

package test;

import java.util.HashMap;

public class TestDom4jReadExample {

    public static void main(String[] args) {
        try {
            //获取解析完后的解析信息
            HashMap<String ,String> hashMap;
            Dom4jReadExample drb=new Dom4jReadExample();
            //遍历整个XML文件
            hashMap =new HashMap<String, String>();
            String n=System.getProperty("user.dir"); //获取当前工程真实路径
            //studentInfo.xml保存学生信息,放在src目录下
            drb.iterateWholeXML(n+"\\src\\studentInfo.xml", hashMap);
            for(int i=0;i<hashMap.size();i+=6){
                int j=i/6;
                System.out.print(hashMap.get("name"+j)+"\t");
                System.out.print(hashMap.get("student-age"+j)+"\t");
                System.out.print(hashMap.get("college"+j)+"\t");
                System.out.print(hashMap.get("college-leader"+j)+"\t");
                System.out.print(hashMap.get("telephone"+j)+"\t");
                System.out.println(hashMap.get("notes"+j)+"\t");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果:
秦羽 25 PC学院 leader 62354666 男,1985年生,硕士,现就读于北京邮电大学
黑羽 20 PC学院 leader 62354999 男,1987年生,硕士,现就读于北京邮电大学
该示例实现了DOM4J读取XML中的数据。使用DOM4J解析XML的关键操作总结如下:
1.Document对象相关
读取XML文件,获得Document对象。
SAXReader reader=new SAXReader();
Document document=reader.read(new File(“input.xml”));
2.节点相关
(1)获取文档的根元素
Element rootElm=document.getRootElement();
(2)取得某节点的单个子节点
Element memberElm=root.element(“member); //”member”是节点名
(3)取得节点的文字
String text=memberElm.getText();
(4)取得某节点下名为“member”的所有字节点并进行遍历
List nodes=rootElm.elements(“member”);
for(Iterator it=nodes.iterator(); it.hasNext();){
Element elm=(Element)it.next();
//……
}
(5)对某节点下的所有子节点进行遍历
for(Iterator it=root.elementIterator(); it.hasNext();){
Element element=(Element) it.next();
}
(6)在某节点下添加子节点
Element ageElm=newMemberElm.addElement(“age”);
(7)设置节点文字
ageElm.setText(“29”);
(8)删除某节点
parentElm.remove(childElm); //childElm是待删除的节点,parentELm是其父节点
(9)添加一个CDATA节点
Element contentElm=infoElm.addElement(“content”);
contentElm.addCDATA(diary.getContent());
contentElm.getText(); //特别说明:获取节点的CDATA值与获取节点的值是同一个方法
contentElm.clearContent(); //清除节点中的内容,CDATA亦可
3.属性相关
(1)取得某节点下的某属性
Element root = document.getRootElement();
Attribute attribute=root.attribute(“size”); //属性名name
(2)取得属性的文字
String text=attribute.getText();
(3)遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator(); it.hasNext();){
Attribute aatribute=(Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
(4)设置某节点的属性和文字
newMemeberElm.addAttribute(“name”,”sitinspring”);
(5)设置属性的文字
Attribute attribute=root.attribute(“name”);
attribute.setText(“sitinspring”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值