用dom4j的方式解析xml文件

需要用到解析xml文件,我采用了dom4j来解释,我们来看下我的小总结吧:
我们需要引入dom4j的包,
先来看我们引入的包吧,因为在java下面有一些类名和dom中的类名重复,所以我们在引入的时候需要注意一下啊:
首先我们来看下我们的xml文件,并且对其进行一个小小的说明:


我们对我们的这个xml文件进行一下小小的特殊说明:
首先来看下我们的这个文件,这是一个迭代性的一个xml,不像一般的那样的一个结点就是一个对象,而这个xml文件是一个继承关系而且迭代关系的结构,我们如果解析的话肯定需要用到的是一个迭代。我们可以清晰地看到我们的一级(红色),二级(蓝色),三级(灰色),其实都是同一个数据结构,这样的话我们如果用迭代的方法去解析,很容易就可以把这个结构进行解析,好了,分析完之后我们进行解析:

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

public class MyParse {
//测试入口方法
public static void main(String[] args) throws DocumentException {
MyParse parse=new MyParse();
parse.read();
parse.print(parse.resultInfos);
}
//说明我们的xml文件存在的位置,存在我们项目的根目录中的XmlData/tui_iphone4.xml中
//我们可以从这个string中看到,我们的路径如果放在了我们项目中,我们可以从我们项目的根
//目录作为起始点,进行路径跟踪,如XmlData就是我们项目根目录中的一个文件夹。
public static String xmlPath = "XmlData/tui_iphone4.xml";
private List resultInfos = new ArrayList(5);
public void read() throws DocumentException {
// 使用SAX方式解析xml
SAXReader saxReader = new SAXReader();//新建dom4j的一个阅读对象
// 把xml文件转换成文档对象
Document document = saxReader.read(xmlPath);//把一个xml文件做成一个文档,即一棵树
// 取得根节点
Element rootNode = (Element) document.getRootElement();
// 取得二级子节点
List rElements = rootNode.elements();
for (int i = 0; i < rElements.size(); i++) {
if (i == 0) {// 节点,特殊处理
//这里我的第一个节点放了不同于其它节点的信息,所以我们需要特殊处理
} else {
readControl(((Element) (rElements.get(i))), resultInfos);
//循环读取第二层非特殊节点
}
}
}
public void readControl(Element element, List infos) {
Info rInfo = new Info();
rInfo.type = element.attribute("type").getValue();
rInfo.img = element.attribute("image").getValue();
rInfo.x = Float.parseFloat(element.attribute("x").getValue());
rInfo.y = Float.parseFloat(element.attribute("y").getValue());
rInfo.ox = Float.parseFloat(element.attribute("ox").getValue());
rInfo.ox = Float.parseFloat(element.attribute("oy").getValue());
rInfo.width = Float.parseFloat(element.attribute("width").getValue());
rInfo.width = Float.parseFloat(element.attribute("height").getValue());
rInfo.width = Float.parseFloat(element.attribute("scalex").getValue());
rInfo.width = Float.parseFloat(element.attribute("scaley").getValue());
rInfo.skewX = Float.parseFloat(element.attribute("skewx").getValue());
rInfo.skewY = Float.parseFloat(element.attribute("skewy").getValue());
rInfo.angle = Float.parseFloat(element.attribute("angle").getValue());

List cElements = element.elements();
if (cElements.size() > 0) {//如果一个节点含有子element,那么说明它有孩子,迭代读取
for (int i = 0, j = cElements.size(); i < j; i++) {
readControl(cElements.get(i), rInfo.childList);//迭代
}
}
if (infos == null) {
infos = new ArrayList(5);
}
infos.add(rInfo);//把读取的信息添加
}
public void print(List list) {
System.out.println(resultInfos);
}
}

Info.java
public class Info {
public String img;
public String type;
public ArrayList childList = new ArrayList();
public float x;
public float y;
public float ox;
public float oy;
public float width;
public float height;
public float scalex;
public float scaley;
public float skewX;
public float skewY;
public int flipX;
public int flipY;
public float angle;
}
注意点:
如果我们的 element.attribute("属性名")的时候,如果我们没有这个属性,那么就会抛出一个空指的异常,所以像这样的话,如果某节点没有这个属性的话,我们可以为它添加上一个空也不要不写,要不然会报错。
dom的原则也是把所有的节点都作用一个Element来作统一管理的,这一点在解析的时候十分有用,灵活地运用对我们灵活的解析非常的重要。

    private TreeMap parseMobileRequest(String mobileRequest) throws Exception {
        TreeMap map = new TreeMap();
        SAXReader saxreader = new SAXReader();                                      //新建dom4j的一个阅读对象
       // mobileRequest = mobileRequest.replaceAll("UTF-8", "gb2312");                //替换字符集,utf—8换为gb2312
        Document document;                                                          //创建Document是文档 
        try {
            document = saxreader.read(new ByteArrayInputStream(mobileRequest.getBytes()));// 取得根节点
            Element incomingForm = document.getRootElement();                       // 取得二级子节点
            Element REQUEST_QUERY_YZM = incomingForm.element("REQUEST_QUERY_YZM");
            Element YZM_XX = REQUEST_QUERY_YZM.element("YZM_XX");
            map.put("sjhm", YZM_XX.elementText("SJHM"));                             //把得到的放到map里
            map.put("yzm", YZM_XX.elementText("YZM"));
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("解析错误:" + e);
            throw new Exception("解析错误");
        }
        return map;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值