0%

dom4j使用ElementHandler解析xml

实现ElementHandler接口

public class MyHandler implements ElementHandler {

    // xml中每一个<节点>开始执行的方法
    @Override
    public void onStart(ElementPath elementPath) {
        // todo 解析xml要做的业务处理
    }

    // xml中每一个<节点>结束执行的方法
    @Override
    public void onEnd(ElementPath elementPath) {
        // todo 解析xml要做的业务处理
        elementPath.getCurrent().detach();
    }
}

ElementPath获取一些信息

// 获取当前解析的<节点>是第几级,根节点为第1级
public static int getLevel(ElementPath path) {
    return path.getPath().split("/").length - 1;
}
// 获取当前节点的节点名
public static String getElementName(Element element) {
    return element.getName();
}

// 获取当前节点属性
public static String getAttribute(Element element) {
    return element.attribute("attribute-name");
}

// 获取当前节点文本
public static String getText(Element element) {
    return element.getText();
}

解析示例

<!-- 要解析的xml格式 -->
<root>
    <book id="1">
        <name>菜鸟编程</name>
        <describe>针对菜鸟编程学习</describe>
    </book>
    <book id="2">
        <name>老鸟编程</name>
        <describe>针对老鸟编程学习</describe>
    </book>
</root>
// book映射对象
@Data
public class Book {
    private int id;
    private String name;
    private String describe;
}
// 解析book.xml伪代码
public class BookHandler implements ElementHandler {
    // 创建一个Book对象
    private Book book;
    // xml中每一个<节点>开始执行的方法
    @Override
    public void onStart(ElementPath elementPath) {
        // 获取节点级数,<root>为1,<book>为2,<name><describe>为3
        level = getLevel(elementPath)
        switch(level):
        case 1: // 不做处理
        case 2: // 每次读取到<book id="xx">这一行会执行
                // 创建book对象,将读取的id属性写入
                book = new Book();
                book.setId();
        case 3: // 每次读取到<book>的子节点会执行
                // 无需处理
    }

    // xml中每一个<节点>结束执行的方法
    @Override
    public void onEnd(ElementPath elementPath) {
        // 获取节点级数,<root>为1,<book>为2,<name><describe>为3
        level = getLevel(elementPath)
        switch(level):
        case 1: // 不做处理
        case 2: // 每次读取到</book>这一行会执行
                // 说明这一本书所有信息已经读完,需要将book对象保存,或写入数据库,然后清空
                saveDB(book); // 保存数据方法
                book = null;
        case 3: // 每次读完一个<book>的子节点会执行
                // 可以读取book的name、describe属性,并写入到book对象中
                // 注意 一次只能获取到一个属性,要做一些处理
                String name = getAttribute("name");
                String describe = getAttribute("describe");
                book.setName(name);
                book.setDescribe(describe);
        elementPath.getCurrent().detach();
    }
}
// 读取xml,使用BookHandler解析
BookHandler bookHandler = new BookHandler();
SAXReader reader = new SAXReader();
reader.setDefaultHandler(bookHandler);
reader.read(new File(xmlPath));